2015-10-15 102 views
3

我想向數據庫表中添加一行,但如果某行存在具有相同唯一鍵的行,我想更新該行。插入SQL表或更新記錄(如果存在)

這裏是我的查詢:

$query = "INSERT INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('$audit_no','$form_details_subquestion_id','$form_details_section_id','$mark') 
ON DUPLICATE KEY UPDATE mark = VALUES($mark)"; 

但是,它將繼續插入新記錄。假設audit_section_id, form_details_subquestion_id, form_details_section_id是唯一鍵。如果audit_section_id, form_details_subquestion_id, form_details_section_id存在,它不會將新記錄插入到數據庫中;同時更新記錄。

我也試過這樣:

REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_‌​details_section_id`,`mark`) 
VALUES ('$audit_no','$form_details_subquestion_id','$form_details_section_id','$mark') 

我不知道的是,我的代碼的for循環的問題。

for ($i=0; $i < ($_POST['count']); $i++) 
{ 
    $form_details_subquestion_id = $_POST['form_details_subquestion_id'][$i]; 
    $form_details_section_id  = $_POST['form_details_section_id'][$i]; 
    $mark       = $_POST['mark'][$i]; 
    $remark       = $_POST['remark'][$i]; 


    //$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";  

    $query = "REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) 
    VALUES ('$audit_no','$form_details_subquestion_id','$form_details_section_id','$mark')"; 
    $result = $db->query($query); 
} 

我使用for循環來插入所有數據。

這裏是echo $ query的輸出;

REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','89','1','1.00') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','86','1','1.00') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','87','1','1.00') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','88','1','1.00') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','85','1','1.00') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','83','1','1.00') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','84','1','1.00') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','81','1','1.00') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','82','1','1.00') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','98','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','99','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','100','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','101','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','102','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','96','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','97','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','90','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','91','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','92','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','93','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','94','1','2') 
REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','95','1','2') 

SQL表

CREATE TABLE IF NOT EXISTS `audit_section_markrecord` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `audit_section_id` int(10) unsigned NOT NULL, 
    `form_details_subquestion_id` int(10) unsigned NOT NULL, 
    `form_details_section_id` int(10) unsigned NOT NULL, 
    `mark` decimal(5,2) unsigned NOT NULL, 
    `dateofmodify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) 
+0

嘗試使用'UPDATE'代替? –

+0

使用REPLACE INTO命令(http://dev.mysql.com/doc/refman/5.7/en/replace.html) – jeff

+0

@TimBiegeleisen bro,以前我使用的是UPDATE語句,但我不確定如何插入新的記錄使用如果其他和檢查數據庫。 – Andrew

回答

3

編輯你的最後一個問題的編輯後:

你在你的表有這樣的:

`id` int(11) NOT NULL AUTO_INCREMENT, 
.... 
PRIMARY KEY (`id`) 

id(主鍵) autoincremental和你的問題是:

我想將一行添加到數據庫表中,但是如果一行存在與 相同的唯一鍵,我想更新該行。

有了您的querys你永遠不會有相同的id因爲你永遠不設定在查詢中id值,您查詢的是:

REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) VALUES ('602633','95','1','2') 

,如果您沒有設置值在id你自動查詢數據庫系統自動增量列值,並且您永遠不必更新一行。


這應該是你的查詢:

$query = "REPLACE INTO audit_section_markrecord(`audit_section_id`,`form_details_subquestion_id`,`form_details_section_id`,`mark`) 
    VALUES ('$audit_no','$form_details_subquestion_id','$form_details_section_id','$mark')"; 

audit_section_idform_details_subquestion_idform_details_section_id列值必須要被替換的行匹配現有行的;否則,插入一行。

你可以讀到更多在:

http://dev.mysql.com/doc/refman/5.7/en/replace.html

例:

考慮下面的CREATE TABLE語句創建表:

CREATE TABLE test (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    data VARCHAR(64) DEFAULT NULL, 
    ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (id) 
); 

當創建該表,並運行在MySQL客戶端顯示的語句,則結果如下:

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00'); 
Query OK, 1 row affected (0.04 sec) 

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42'); 
Query OK, 2 rows affected (0.04 sec) 

mysql> SELECT * FROM test; 
+----+------+---------------------+ 
| id | data | ts     | 
+----+------+---------------------+ 
| 1 | New | 2014-08-20 18:47:42 | 
+----+------+---------------------+ 
1 row in set (0.00 sec) 

現在如果你創建第二表幾乎等同於第一,不同之處在於主鍵現在佔地2列,如圖所示(PRIMARY KEY (id, ts)):

CREATE TABLE test2 (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    data VARCHAR(64) DEFAULT NULL, 
    ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (id, ts) 
); 

當你test2的兩個相同的運行REPLACE語句,因爲我們沒有在原來的(第一)測試表,我們得到一個不同的結果:

mysql> REPLACE INTO test2 VALUES (1, 'Old', '2014-08-20 18:47:00'); 
Query OK, 1 row affected (0.05 sec) 

mysql> REPLACE INTO test2 VALUES (1, 'New', '2014-08-20 18:47:42'); 
Query OK, 1 row affected (0.06 sec) 

mysql> SELECT * FROM test2; 
+----+------+---------------------+ 
| id | data | ts     | 
+----+------+---------------------+ 
| 1 | Old | 2014-08-20 18:47:00 | 
| 1 | New | 2014-08-20 18:47:42 | 
+----+------+---------------------+ 
2 rows in set (0.00 sec) 

這是由於以下事實:在test2上運行時,id和ts列值必須與要替換的行的現有行的值匹配;否則,插入一行。

相關問題