如果不存在则插入

时间:2011-03-11 02:06:04

标签: mysql

如何在表格中只有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

3 个答案:

答案 0 :(得分:1)

作为explained in the manual,需要在(标签,值)或(标签,值,desc)上创建UNIQUE索引,以便REPLACE INTO确定唯一性。

答案 1 :(得分:1)

您想要的是使用“ON DUPLICATE KEY UPDATE”语法。阅读完整的详细信息但是,基本上您需要为您的某个字段设置唯一或主键,然后启动正常的插入查询并将该代码(以及您想要实际更新的内容)添加到最后。然后,db引擎将尝试添加信息,当它遇到已经插入的重复键时,它已经知道只是使用新信息更新您告诉它的所有字段。

答案 2 :(得分: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

评论:

  • 你应该避免更换 新数据和旧数据是 相同。更换应仅适用于 有高的情况 检测关键值的概率 这是相同的,但非关键 价值观不同。
  • 将数据放入临时表允许 要进行按摩,转换和修改的数据 在插入目标之前很容易 表
  • 从临时表中删除行是 更快。
  • 如果出现任何问题,临时表 为您提供额外的调试 阶段找出问题所在。
  • 应该考虑在一次交易中完成所有工作。