2015-04-27 119 views
1

我已經實現了這個代碼來插入和更新我的數據庫中的數據,但是當我嘗試它時,一個新行的數據總是被插入表中並且它沒有被更新我怎樣才能定義在我的情況下唯一的關鍵是讓它工作?我有主鍵ID。定義表的唯一鍵約束

<?php 

$json = '{"latitude":53.86898451,"longitude":10.66561387,"route":4}'; 

$data = json_decode ($json); 

$route = "route_" . $data->{'route'}; 
$latitude = $data->{'latitude'}; 
$longitude = $data->{'longitude'}; 

require 'connection.php'; 

// check whether route's table exist. 
$results = $con->query ("SHOW TABLES LIKE'" . $route . "'") or die (mysqli_error()); 

if (($results->num_rows) == 1) { 
    //"UPDATE MyGuests SET lastname='Doe' WHERE id=2" 
$sql = "INSERT INTO ".$route."(latitude, longitude, created_at) 
      VALUES(? , ? , NOW()) 
      ON DUPLICATE KEY 
      UPDATE latitude = VALUES(latitude) 
       , longitude = VALUES(longitude)"; 

    $stmt = $con->prepare($sql) or die ($con->error); 
    $stmt->bind_param("ss",$latitude,$longitude); 
    $stmt->execute(); 

    $stmt->close(); 

    echo "Table exist"; 
} else { 
    $create = "CREATE TABLE " . $route . " 
     (id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY UNIQUE, 
    latitude FLOAT(10,6) NOT NULL, 
    longitude FLOAT(10,6) NOT NULL, 
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)" ; 
    $stmt = $con->prepare($create) or die ($con->error); 
    $stmt->execute(); 

    $stmt->close(); 


    echo "table was craeted"; 
} 

UPDATE

這就是我現在

$sql = "INSERT INTO ".$route."(id, latitude, longitude, created_at) 
     VALUES(id, ? , ? , NOW()) 
     ON DUPLICATE KEY 
     UPDATE latitude = VALUES(latitude) 
      , longitude = VALUES(longitude)"; 

我應該在值添加哪個變量括號爲ID努力?

+0

它應該如何知道哪一行更新?你的桌子不應該有「路線」列嗎? – Barmar

+0

順便說一句:你不需要爲主鍵說'UNIQUE',它總是唯一的。你不需要插入'created_at'列,因爲它默認爲當前時間。 – Barmar

+0

@Barmar:我不明白你的意思嗎?我必須在表格中添加路線列才能使其工作? – tree

回答

3

您在INSERT INTO語句中未指定id的值,因此永遠不會有重複的鍵。

而是自動生成下一個可用ID。

要解決此問題,請指定預先存在的ID(如果有)的值。

+0

和哪些可擴展的應該添加在'VALUES'標識符的ID?請看我更新的代碼。 – tree

+0

請不要編輯您的問題以掩飾原始問題。相反,在更新嘗試後添加到最後。在表面上,你的編輯看起來應該可以工作,假設你已經保存了從數據庫中選擇出來的'id'。在問題中沒有足夠的代碼來知道這是否正在發生,或者你在保存它的位置。 –

+0

我編輯了您的問題以恢復原始版本,並將更改添加到最後。 –