我正在try 执行以下查询:

INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name='value'
);

但这会返回一个错误.基本上,如果记录的"名称"字段已经存在于另一个记录中,我不想插入记录——如何判断新名称是否唯一?

推荐答案

我并不是真的建议你这么做,因为Piskvor和其他人建议的UNIQUE指数是一种更好的方法,但你实际上可以做你试图做的事情:

CREATE TABLE `table_listnames` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `address` varchar(255) NOT NULL,
  `tele` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

插入一条记录:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

SELECT * FROM `table_listnames`;

+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
+----+--------+-----------+------+

再次try 插入相同的记录:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;

Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
+----+--------+-----------+------+

插入其他记录:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'John'
) LIMIT 1;

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

SELECT * FROM `table_listnames`;

+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
|  2 | John   | Doe       | 022  |
+----+--------+-----------+------+

等等


更新:

为了防止两个值相等时出现#1060 - Duplicate column name错误,必须将内部 Select 的列命名为:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Unknown' AS name, 'Unknown' AS address, '022' AS tele) AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

SELECT * FROM `table_listnames`;

+----+---------+-----------+------+
| id | name    | address   | tele |
+----+---------+-----------+------+
|  1 | Rupert  | Somewhere | 022  |
|  2 | John    | Doe       | 022  |
|  3 | Unknown | Unknown   | 022  |
+----+---------+-----------+------+

Mysql相关问答推荐

为什么双破折号(--)会导致此MariaDB条款的计算结果为True?

在SQL中,复合索引最左边的前置是否与非复合索引一样性能?

try 恢复数据库时,如何正确解决行大小太大消息?

嵌套MySQL语句问题

将值代入子查询

找出同一表中列A中的每个值在列B中出现的次数

如何计算超过特定数字的所有不同ID组,然后返回这些ID?

Mysql - Select 匹配某些条件的两条记录之间经过的最大天数

Hibernate 不创建表'

如何计算具有权重属性的记录数

mySql 查询运行速度超慢

有人可以帮我用 R 编程解决这个问题吗?

MySQL - 考虑到所有前几天,每天计算唯一用户

如何查看 rdsadmin 在 mysql 实例上的权限?

sql sum - 处理连接表中的脏重复项

如何在 MySQL 中删除具有 2 列作为复合主键的多行?

Facebook user_id:big_int、int 还是 string?

在 MySQL 的存储过程中调用存储过程

MySQL 整数与日期时间索引

MySQL行格式:固定和动态之间的区别?