MySQL,如果不存在则插入行

标签 mysql transactions insert

Possible Duplicate:
how to use if not exists while inserting a row mysql

我有问题:

我有一个名为“table”的表,有 4 列:id(int, PK, AI, Unique), col1(varchar), col2(varchar), col3(datetime)

许多用户可以连接到 mysql 服务器并向“表”中插入行。问题是 col2 和 col3 不能存在于“table”中的其他行中。

我会写这样的东西: 如果不存在(从表中选择*,其中 col2='2' 和 col3='2012-12-12 12:12:12')插入表(​​col1,col2,col3)值(1,2,'2012-12) -12 12:12:12')

我假设你知道我想做什么。

我试图在一个语句中或在事务中执行此操作(以避免 2 个用户同时插入同一行的情况)。如果我应该在事务中执行此操作,那么它应该是什么类型的隔离?可序列化隔离会导致锁定表,因此会进一步减慢插入过程。 请帮助我。

最佳答案

如果您不希望 col2 和 col3 对重复(即 col 2 可以有重复项,但任何对 col2 和 col3 只出现一次),您可以指定:

UNIQUE(col2,col3)

现在尝试插入 col2,col3 对的任何查询都将失败。您可以使用以下方法处理此问题:

INSERT IGNORE INTO table(col1, col2, col3) values(1,2,'2012-12-12 12:12:12');

或者如果插入应该更改您可以使用的值:

INSERT INTO table(col1, col2, col3) values(1,2,'2012-12-12 12:12:12') 
      ON DUPLICATE KEY UPDATE someCol=someVal

关于MySQL,如果不存在则插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13906530/

相关文章:

sqlite - JPA EntityManager不在SQLite数据库中提交更改

sql-server - 在 SQL Server 上回滚转换和解锁表

sql - 对于 select 中的每一行,将多行插入到一个表中

c# - 如何在小巧玲珑中返回原始数据类型的元组

mysql - 重写 5.7 版本中的 SQL

NHibernate - 为什么 Delete() 调用无法删除但通过 HQL 删除有效?

sql - Oracle ProC INSERT INTO VALUES ( (选择 ...) )

php - 在 magic_quotes 打开的服务器上 INSERT 失败

php - 在连接查询中根据表名区分记录

MySQL 5.6.41 错误号 1064 : Creating a MySQL query with variables