mysql重复插入停止

ar7v8xwq  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(346)

我知道这个问题已经回答了很多时间,但我真的想知道这是如何正确的行为,我与文件,但有些东西仍然缺少。。。
我有一个id为的表,但我没有使用id进行插入,也没有任何索引或唯一键,对此我没有任何计划:如果我必须解决这个问题,
我写下以下内容:

insert into mytable(name,details,industry,attachments) values('abc','xyz',1,'BlobImage') 
ON DUPLICATE KEY UPDATE [what should be here]

我不知道该项目的主键被插入,所以它会自动判断或如何?

oaxa6hgo

oaxa6hgo1#

我可以看到关于复制密钥更新的工作原理有一些混乱,所以我会尽力解释。
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无法为您做出设计决策。
因此,首先您需要一种情况,即给定的查询由于具有不需要的重复值而实际失败,为此,您需要某种有效触发错误的约束:

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阻止您这样做。这些要求相互矛盾。

相关问题