INSERT INTO `table` (value1, value2)
SELECT 'stuff for value1', 'stuff for value2' FROM `table`
WHERE NOT EXISTS (SELECT * FROM `table`
WHERE value1='stuff for value1' AND value2='stuff for value2')
LIMIT 1
或者,外部 SELECT 语句可以引用 DUAL ,以便处理表最初为空的情况:
INSERT INTO `table` (value1, value2)
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `table`
WHERE value1='stuff for value1' AND value2='stuff for value2')
LIMIT 1
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
如果记录存在,它将被覆盖;如果它还不存在,它将被创建 .
4
请尝试以下方法:
IF (SELECT COUNT(*) FROM beta WHERE name = 'John' > 0)
UPDATE alfa SET c1=(SELECT id FROM beta WHERE name = 'John')
ELSE
BEGIN
INSERT INTO beta (name) VALUES ('John')
INSERT INTO alfa (c1) VALUES (LAST_INSERT_ID())
END
UPDATE wp_postmeta SET meta_value = ? WHERE meta_key = ? AND post_id = ?;
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) SELECT DISTINCT ?, ?, ? FROM wp_postmeta WHERE NOT EXISTS(SELECT * FROM wp_postmeta WHERE meta_key = ? AND post_id = ?);
9 回答
或者,外部
SELECT
语句可以引用DUAL
,以便处理表最初为空的情况:如果可以接受异常,任何简单约束都应该完成 . 例子 :
主键如果不是代理
列上的唯一约束
多列唯一约束
对不起,这看起来似乎很简单 . 我知道您与我们分享的链接看起来很糟糕 . ;-(
但我永远不会给出这个答案,因为它似乎满足了你的需要 . (如果没有,它可能会触发您更新您的要求,这也是“好事”(TM)) .
Edited :如果插入会破坏数据库唯一约束,则会在数据库级别抛出异常,由驱动程序中继 . 它肯定会因为失败而停止你的脚本 . 在PHP中必须能够解决这种情况......
使用
INSERT IGNORE INTO table
见http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html
还有
INSERT … ON DUPLICATE KEY UPDATE
语法,你可以在dev.mysql.com上找到解释Post from bogdan.org.ua according to Google's webcache:
这是一个PHP函数,只有在表中不存在所有指定的列值时才会插入行 .
如果其中一列不同,则会添加该行 .
如果表为空,则将添加该行 .
如果存在所有指定列具有指定值的行,则不会添加该行 .
用法示例:
on duplicate key update,或insert ignore可以成为MySQL的可行解决方案 .
Example of on duplicate key update update based on mysql.com
Example of insert ignore based on mysql.com
要么:
要么:
如果记录存在,它将被覆盖;如果它还不存在,它将被创建 .
请尝试以下方法:
如果您有
UNIQUE
索引可以使用ON DUPLICATE KEY
或INSERT IGNORE
进行检查,则有几个答案可以解决此问题 . 情况并非总是如此,并且由于UNIQUE
具有长度约束(1000字节),因此您可能无法更改它 . 例如,我不得不使用WordPress中的元数据(wp_postmeta
) .我终于解决了两个问题:
查询1是常规
UPDATE
查询,当有问题的数据集不存在时,查询无效 . 查询2是INSERT
,它取决于NOT EXISTS
,即INSERT
仅在数据集不存在时执行 .尝试:
或者你可以这样做:
这种方法快速简便 . 为了提高大表INDEX列'xxx'(在我的例子中)中查询的速度 .