2011-03-11 84 views
0

如何在表格中只有3行並僅更新它們?
我有settings表,並在第一次運行沒有什麼,所以我想插入3條記錄,像這樣:如果不存在則插入

 
id | label | Value | desc 
-------------------------- 
1 start 10  0 
2 middle 24  0 
3 end  76  0 

這從PHP腳本後,我需要從一個查詢更新此設置。 我已經研究過REPLACE INTO,但最終在DB中出現重複行。

這裏是我當前的查詢:

$query_insert=" REPLACE INTO setari (`eticheta`, `valoare`, `disabled`) 
       VALUES ('mentenanta', '".$mentenanta."', '0'), 
         ('nr_incercari_login', '".$nr_incercari_login."', '0'), 
         ('timp_restrictie_login', '".$timp_restrictie_login."', '0') 
       "; 

任何想法?

這裏是create table語句。就這樣你可以看到萬一我失去了一些東西。

CREATE TABLE `setari` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `eticheta` varchar(200) NOT NULL, 
    `valoare` varchar(250) NOT NULL, 
    `disabled` tinyint(1) unsigned NOT NULL default '0', 
    `data` datetime default NULL, 
    `cod` varchar(50) default NULL, 
    PRIMARY KEY (`eticheta`,`id`,`valoare`), 
    UNIQUE KEY `id` (`eticheta`,`id`,`valoare`) 
) ENGINE=MyISAM 
+0

您的「當前查詢」與問題完全無關。毫無疑問,要清楚。 – zerkms 2011-03-11 02:12:37

+0

要清楚,在您運行「當前查詢」之後,上面顯示的表格將包含6條記錄或仍然有3條記錄? – 2011-03-11 02:32:05

+0

將有6條記錄。實際上是在每次運行中添加3條記錄。 – 2011-03-11 02:34:08

回答

1

作爲explained in the manual,需要在(標籤,值)或(標籤,值,遞減)創建唯一索引爲REPLACE INTO確定唯一性。

+0

'Eticheta'也是獨一無二的'ID'和'valoare'。這裏是從表創建「UNIQUE KEY('eticheta','id','valoare')」 – 2011-03-11 02:28:18

1

你想要的是使用'ON DUPLICATE KEY UPDATE'語法。通讀它的全部細節,但基本上你需要有一個字段的唯一或主鍵,然後開始一個普通的插入查詢,並將該代碼(以及你想要實際更新的)添加到最後。然後,數據庫引擎將嘗試添加信息,當它遇到已插入的重複密鑰時,它就知道只需用新信息更新所有告訴它的字段。

+0

我已經閱讀了從MySQL網站的重複密鑰更新手冊,但我不認爲我可以做我想要的東西。也許我錯過了一些東西 – 2011-03-11 02:27:59

+0

@Bogdan:這個函數的好處是,如果沒有重複鍵錯誤,它只是插入記錄沒有錯誤。另外,請在上面的實際問題中查看我的評論/問題。 – 2011-03-11 02:31:12

+0

我已將查詢更改爲:$ query_insert =「INSERT INTO setari('eticheta','valoare','disabled')VALUES('mentenanta',''。$ mentenanta。」','0'),( 'nr_incercari_login','「。$ nr_incercari_login。」','0'),('timp_restrictie_login','「。$ timp_restrictie_login。''','0')ON DUPLICATE KEY UPDATE'eticheta' ='」。$ mentenanta。 「','eticheta' ='」。$ nr_incercari_login。「','eticheta' ='」。$ timp_restrictie_login。「'」; 結果是一樣的。在DB中有多行而不是隻有三行... – 2011-03-11 02:50:34

0

我只是略過頭痛,並使用臨時表。快速,乾淨。

SQL Server允許您通過爲您創建一個不存在的臨時表來選擇它。但是,MySQL需要你先創建臨時數據庫,然後插入它。

1. 創建空的臨時表。

CREATE TEMPORARY TABLE IF NOT EXISTS insertsetari 
SELECT eticheta, valoare, disabled 
FROM setari 
WHERE 1=0 

2. 將數據插入臨時表中。

INSERT INTO insertsetari 
VALUES 
('mentenanta', '".$mentenanta."', '0'), 
('nr_incercari_login', '".$nr_incercari_login."', '0'), 
('timp_restrictie_login', '".$timp_restrictie_login."', '0') 

3. 刪除已在目標表中找到的臨時表中的行。

DELETE a FROM insertsetari AS a INNER JOIN setari AS b 
WHERE a.eticheta = b.eticheta 
    AND a.valoare = b.valoare 
    AND a.disabled = b.disabled 

4. 將臨時表殘差行插入到目標表中。

INSERT INTO setari 
SELECT * FROM insertsetari 

5. 清理臨時表。

DELETE insertsetari 

評論:

  • 你應該避免更換時 新數據和舊數據是 相同。替換應該只用於 的情況,其中 的檢測密鑰值的概率很高 相同但非關鍵值 的值不同。
  • 將數據放入臨時表允許在插入到目標 表之前輕鬆地按摩,轉換和修改 數據。
  • 從臨時表中刪除行數是 更快。
  • 如果出現任何問題,臨時表 會爲您提供一個額外的調試階段,以查明問題所在。
  • 應考慮在一次交易中完成所有操作。
+0

謝謝你的提示。我會考慮什麼時候我用完測試想法。我正在測試每個人的sugesstions,直到現在:) – 2011-03-11 03:16:24