Mysql 如果表为空,是否执行INSERT?

Mysql 如果表为空,是否执行INSERT?,mysql,sql,Mysql,Sql,是否有一种方法可以在计数条件下进行插入,例如: INSERT INTO my_table (colname) VALUES('foo') IF COUNT(my_table) < 1 基本上,如果表当前为空,我希望插入一条默认记录。我正在使用mysql。使用SELECT而不是VALUES,以便能够使用WHERE子句扩展查询 EXISTS是比COUNT更好更快的测试 INSERT INTO my_table (colname) SELECT 'foo' WHERE NOT EXISTS (

是否有一种方法可以在计数条件下进行插入,例如:

INSERT INTO my_table (colname) VALUES('foo') IF COUNT(my_table) < 1

基本上,如果表当前为空,我希望插入一条默认记录。我正在使用mysql。

使用SELECT而不是VALUES,以便能够使用WHERE子句扩展查询

EXISTS是比COUNT更好更快的测试

INSERT INTO my_table (colname)
SELECT 'foo'
WHERE NOT EXISTS (SELECT * FROM my_table)

一种方法是在列上放置唯一键。然后执行以下操作:

“替换”的工作原理与“插入”完全相同, 除了如果表中有一个旧的行 具有与的新行相同的值 主键或唯一索引,旧 在删除新行之前删除行 插入


这更容易阅读:

INSERT INTO my_table (colname) 
SELECT 'foo' FROM DUAL
WHERE NOT EXISTS (SELECT * FROM my_table);
通过提供值的SELECT FROM DUAL可以缓解a值的缺乏。FROM-DUAL并不总是必需的,但是在需要它的地方,比如我正在使用的Percona的安装,将它包含在这种奇怪的配置中并没有什么坏处


NOT EXISTS比在具有大量行的表上进行计数要快,这可能会很慢

+1:我正要写这样的东西,突然你的答案出现了替换的另一种方法是使用INSERT IGNORE,当语句无法执行时,它将生成警告而不是错误。您可能需要使用伪表DUAL来实现此操作。插入my_表colname从不存在的双精度中选择'foo'从my_表中选择*插入my_表colname从不存在的双精度中选择'bar'中选择'foo'从my_表中选择*内联虚拟table@SandeepGB完全不需要内联表。这是MySQL,不是OracleSub查询会对性能造成什么影响?如果错误存在,只执行一次插入并捕获它会更好吗?性能影响将取决于是否使用了任何索引。从可读性和维护的角度来看,如果行不存在,则执行SELECT然后执行insert可能更好,因为这种查询很奇怪。我也不想做插入忽略仅仅因为它看起来像是你在要求分类头痛的道路上。
INSERT INTO my_table (colname) 
SELECT 'foo' FROM DUAL
WHERE NOT EXISTS (SELECT * FROM my_table);