我知道这个问题已经回答了无数次,但是我真的很想知道它的行为方式,我和文档一起去了,但是仍然缺少某些东西...
我有一个带有ID的表,但我没有使用ID进行插入,也没有任何索引或唯一键,而且我对此没有任何计划:如果我必须解决此问题,
我的以下写作:
insert into mytable(name,details,industry,attachments) values('abc','xyz',1,'BlobImage')
ON DUPLICATE KEY UPDATE [what should be here]
我不知道要插入的物品的PK,所以它会自动判断还是如何判断?
答案 0 :(得分:0)
我看到ON DUPLICATE KEY UPDATE的工作方式有些混乱,所以我会尽力进行解释。
MySQL重复项没有任何问题:
mysql> create table foo (
-> name varchar(50)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into foo (name) values ('Jim'), ('Jim'), ('Jim'), ('Jim');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from foo;
+------+
| name |
+------+
| Jim |
| Jim |
| Jim |
| Jim |
+------+
4 rows in set (0.02 sec)
能够避免在数据库服务器级别重复数据是您需要选择的一项可选功能。上面的示例还说明MySQL根本不需要主键(或关键的键)。所有这些都是系统提供的工具,可用于完成任务:帮助进行标准化设计,提高性能等。
直觉可以暗示一次又一次拥有相同的数据并不仅仅是正确的。好吧,这仅取决于数据的含义。例如,这很可能是错误的:
mysql> create table user (
-> user_id int(10) auto_increment,
-> username varchar(20),
-> password varchar(255),
-> primary key (user_id)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into user (username, password) values ('jim', '$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user (username, password) values ('jim', '$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user order by user_id;
+---------+----------+--------------------------------------------------------------+
| user_id | username | password |
+---------+----------+--------------------------------------------------------------+
| 1 | jim | $2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K |
| 2 | jim | $2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K |
+---------+----------+--------------------------------------------------------------+
2 rows in set (0.02 sec)
…但这很好(尽管它基本上是相同的设计):
mysql> create table sign_in_log (
-> user_id int(10) auto_increment,
-> username varchar(20),
-> sign_in_time datetime,
-> primary key (user_id)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into sign_in_log (username, sign_in_time) values ('jim', now());
Query OK, 1 row affected (0.00 sec)
mysql> insert into sign_in_log (username, sign_in_time) values ('jim', now());
Query OK, 1 row affected (0.00 sec)
mysql> select * from sign_in_log order by user_id;
+---------+----------+---------------------+
| user_id | username | sign_in_time |
+---------+----------+---------------------+
| 1 | jim | 2018-07-03 09:32:22 |
| 2 | jim | 2018-07-03 09:32:22 |
+---------+----------+---------------------+
2 rows in set (0.00 sec)
INSERT ... ON DUPLICATE KEY UPDATE
是进一步处理重复插入的工具,关键点是:
因此首先,您需要一种情况,即给定查询由于具有多余的重复值而实际上失败,为此,您需要某种约束来有效触发错误:
mysql> create table user_tag (
-> username varchar(20),
-> tag varchar(20),
-> tag_count int(10) default 1,
-> unique index unique_user_tag_combination (username, tag)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into user_tag (username, tag) values ('jim', 'sql');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user_tag (username, tag) values ('jim', 'sql');
ERROR 1062 (23000): Duplicate entry 'jim-sql' for key 'unique_user_tag_combination'
…,然后您可以使用该工具处理这种情况并完成与查询失败不同的操作,例如:
mysql> insert into user_tag (username, tag) values ('jim', 'sql') on duplicate key update tag_count = tag_count + 1;
Query OK, 2 rows affected (0.00 sec)
mysql> insert into user_tag (username, tag) values ('jim', 'sql') on duplicate key update tag_count = tag_count + 1;
Query OK, 2 rows affected (0.00 sec)
mysql> select * from user_tag;
+----------+------+-----------+
| username | tag | tag_count |
+----------+------+-----------+
| jim | sql | 3 |
+----------+------+-----------+
1 row in set (0.00 sec)
我希望这能解释您的请求为什么没有真正意义:
我也没有任何索引或唯一键,而我对此没有任何计划
您已经设计了一种表,使其可以存储具有相同值的几行,但是您希望MySQL阻止您这样做。这些是矛盾的要求。