如何防止重复信息进入mysql数据库?
Posted
技术标签:
【中文标题】如何防止重复信息进入mysql数据库?【英文标题】:How can I prevent duplicate information from entering the mysql database? 【发布时间】:2021-01-13 19:52:35 【问题描述】:在这个程序中,我创建了一个名为 mydata 的数据库,并创建了一个名为 Mining 的表,我想从一个列表中读取我的姓名、姓氏和年龄,如果它不在数据库中,则将其保存在数据库中。但是我遇到了麻烦,我的程序出错了。
其实在写SQL语法的时候,如果数据不存在,它就会把数据存入数据库。我有问题
我的代码:
import mysql.connector
cnx = mysql.connector.connect(
host='localhost',
user = 'root',
password = '',
database = 'mydata'
)
c = cnx.cursor()
list_number = ['mobin','ghanbari',15]
for i in list_number:
c.execute('INSERT INTO mining VALUES ("%s","%s","%s") WHERE NOT EXISTS (SELECT * FROM mining)'%(i,i,i))
请帮我解决这个问题
【问题讨论】:
在unique中创建您不希望有任何重复的列。 数据库中已经有信息了。我的意思是如果列表中的信息不在数据库中,应该添加到数据库中。 您应该向数据库发送查询以插入它,如果返回值不是true
,则表示查询错误或唯一列已经具有该值。否则会被插入。如果我不明白你的问题,我很抱歉。
请将您的答案放在答案部分。谢谢
我已经发布了我的答案。
【参考方案1】:
您需要为不想重复的字段添加唯一索引
这里是一个包含 3 个字段的示例。您可以使用多个字段
mysql> ALTER TABLE mining ADD UNIQUE INDEX(your_field1, your_field2,your_field3);
并使用 INSERT IGNORE 而不是 INSERT 。这可以防止查询在表中插入两次或多次相同的数据
for i in list_number:
c.execute('INSERT IGNORE INTO mining VALUES ("%s","%s","%s") )
或者执行查询:
SELECT * FROM mining WHERE
your_field1 = 'mobin' AND
your_field2 = 'ghanbari' AND
your_field3 = 15;
在查询 INSERT 之前。
如果 SELECT 查询返回某些内容,则不要执行 INSERT 查询。否则执行 INSERT 查询。
【讨论】:
你的答案是错误的。我只是说如何在数据库中输入非重复信息。您的解决方案无效 我会尽量在新的答案中尽可能清晰和详细。【参考方案2】:您应该使不希望重复信息的列具有唯一性。这样,当您尝试将重复信息放入其中时,SQL 将在 Python 中向您发送失败消息。
以这张表为例:
username (unique) | password |
---|---|
myusername | mypassword |
当您尝试添加[newusername,newpassword]
时,不会出现任何错误。
username (unique) | password |
---|---|
myusername | mypassword |
newusername | newpassword |
如果我们插入[anotherusername,mypassword]
,它不会报错,因为password
不是唯一的
username (unique) | password |
---|---|
myusername | mypassword |
newusername | newpassword |
anotherusername | mypassword |
但是当我们尝试插入 [myusername,anotherpassword]
时,SQL 会向 Python 返回一个错误,指出由于 username
列是唯一的,因此无法插入重复数据(myusername
是重复的)。
username (unique) | password |
---|---|
myusername | mypassword |
newusername | newpassword |
anotherusername | mypassword |
请参阅this tutorial,了解如何使列独一无二。
【讨论】:
【参考方案3】:访问mysql
$ mysql -u root -p
从命令行在 mysql 上创建数据库和表作为示例。
mysql> CREATE DATABASE sof;
查询正常,1 行受影响(0.00 秒)
mysql> use sof;
数据库已更改
mysql> CREATE TABLE mining (
-> id int NOT NULL AUTO_INCREMENT,
-> lastname varchar(255) NOT NULL,
-> firstname varchar(255),
-> age int,
-> PRIMARY KEY (id)
-> );
查询正常,0 行受影响(0.01 秒)
mysql> show tables;
+---------------+
| Tables_in_sof |
+---------------+
| mining |
+---------------+
mysql> explain mining;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| lastname | varchar(255) | NO | | NULL | |
| firstname | varchar(255) | YES | MUL | NULL | |
| age | int(11) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> ALTER TABLE mining ADD UNIQUE INDEX(firstname, lastname, age);
查询正常,0 行受影响(0.02 秒) 记录:0 重复:0 警告:0
mysql> SHOW INDEXES FROM mining;
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| mining | 0 | PRIMARY | 1 | id | A | 2 | NULL | NULL | | BTREE | | |
| mining | 0 | firstname | 1 | firstname | A | 2 | NULL | NULL | YES | BTREE | | |
| mining | 0 | firstname | 2 | lastname | A | 2 | NULL | NULL | | BTREE | | |
| mining | 0 | firstname | 3 | age | A | 3 | NULL | NULL | YES | BTREE | | |
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)
请注意字段Non_unique
如果索引可以包含重复项,则为 1,如果不能包含重复项,则为 0。
现在是 Python 脚本:
import mysql.connector
mydb = mysql.connector.connect(
host='localhost',
user = 'root',
password = '',
database = 'sof'
)
cursor = mydb.cursor()
listd =[
'firstname':'mobin1','lastname':'ghanbari1','age':15,
'firstname':'mobin2','lastname':'ghanbari2','age':16,
'firstname':'mobin3','lastname':'ghanbari3','age':17,
'firstname':'mobin4','lastname':'ghanbari4','age':18
]
for row in listd:
sql = "INSERT INTO mining (firstname, lastname , age) VALUES (%s, %s, %s)"
val = (row['firstname'],row['lastname'], row['age'])
try:
cursor.execute(sql, val)
mydb.commit()
print(cursor.rowcount, "record inserted for "+row["firstname"])
except mysql.connector.Error as err:
print("mysql exception: ".format(err))
print(cursor.rowcount, "record inserted for "+row["firstname"])
输出:
1 record inserted for mobin1
1 record inserted for mobin2
1 record inserted for mobin3
1 record inserted for mobin4
检查 mysql 是否插入了记录
mysql> select * from mining;
+----+-----------+-----------+------+
| id | lastname | firstname | age |
+----+-----------+-----------+------+
| 1 | ghanbari1 | mobin1 | 15 |
| 2 | ghanbari2 | mobin2 | 16 |
| 3 | ghanbari3 | mobin3 | 17 |
| 4 | ghanbari4 | mobin4 | 18 |
+----+-----------+-----------+------+
4 rows in set (0.00 sec)
在 Python 脚本列表中添加一些数据*
import mysql.connector
mydb = mysql.connector.connect(
host='localhost',
user = 'root',
password = '',
database = 'sof'
)
cursor = mydb.cursor()
listd =[
'firstname':'mobin1','lastname':'ghanbari1','age':15,
'firstname':'mobin2','lastname':'ghanbari2','age':16,
'firstname':'mobin3','lastname':'ghanbari3','age':17,
'firstname':'mobin4','lastname':'ghanbari4','age':18,
'firstname':'mobin5','lastname':'ghanbari5','age':19,
'firstname':'mobin6','lastname':'ghanbari6','age':20,
'firstname':'mobin7','lastname':'ghanbari7','age':21
]
for row in listd:
sql = "INSERT INTO mining (firstname, lastname , age) VALUES (%s, %s, %s)"
val = (row['firstname'],row['lastname'], row['age'])
try:
cursor.execute(sql, val)
mydb.commit()
print(cursor.rowcount, "record inserted for "+row["firstname"])
except mysql.connector.Error as err:
print("mysql exception: ".format(err))
print(cursor.rowcount, "record inserted for "+row["firstname"])
运行 Python 脚本
输出:
mysql exception: 1062 (23000): Duplicate entry 'mobin1-ghanbari1-15' for key 'firstname'
-1 record inserted for mobin1
mysql exception: 1062 (23000): Duplicate entry 'mobin2-ghanbari2-16' for key 'firstname'
-1 record inserted for mobin2
mysql exception: 1062 (23000): Duplicate entry 'mobin3-ghanbari3-17' for key 'firstname'
-1 record inserted for mobin3
mysql exception: 1062 (23000): Duplicate entry 'mobin4-ghanbari4-18' for key 'firstname'
-1 record inserted for mobin4
1 record inserted for mobin5
1 record inserted for mobin6
1 record inserted for mobin7
检查 mysql 是否有重复条目
mysql> select * from mining;
+----+-----------+-----------+------+
| id | lastname | firstname | age |
+----+-----------+-----------+------+
| 1 | ghanbari1 | mobin1 | 15 |
| 2 | ghanbari2 | mobin2 | 16 |
| 3 | ghanbari3 | mobin3 | 17 |
| 4 | ghanbari4 | mobin4 | 18 |
| 13 | ghanbari5 | mobin5 | 19 |
| 14 | ghanbari6 | mobin6 | 20 |
| 15 | ghanbari7 | mobin7 | 21 |
+----+-----------+-----------+------+
7 rows in set (0.00 sec)
如您所见,表格中没有重复的条目。
【讨论】:
以上是关于如何防止重复信息进入mysql数据库?的主要内容,如果未能解决你的问题,请参考以下文章