Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何防止重复信息进入mysql数据库?_Python_Mysql_Sql - Fatal编程技术网

Python 如何防止重复信息进入mysql数据库?

Python 如何防止重复信息进入mysql数据库?,python,mysql,sql,Python,Mysql,Sql,在这个程序中,我创建了一个名为mydata的数据库,并创建了一个名为mining的表,我想从中的列表中读取我的姓名和年龄,如果它不在数据库中,请将其保存在数据库中。但我遇到了麻烦,我的程序出现了错误 事实上,在编写SQL语法时,如果数据不存在,它会将数据存储在数据库中。我有个问题 霉菌代码: import mysql.connector cnx = mysql.connector.connect( host='localhost', user = 'root', pa

在这个程序中,我创建了一个名为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))


请帮助我解决此问题

您需要为不希望重复的字段添加唯一索引

下面是一个包含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;
在查询之前插入


如果SELECT查询返回某些内容,则不执行INSERT查询。否则执行插入查询。

您需要为不希望重复的字段添加唯一索引

下面是一个包含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;
在查询之前插入


如果SELECT查询返回某些内容,则不执行INSERT查询。否则执行插入查询。

您应该使不需要重复信息的列唯一。这样,当您尝试将重复信息放入其中时,SQL将用Python向您发送一条失败消息

例如,以下表为例:

用户名(唯一) 密码 我的用户名 我的密码
您应该使不需要重复信息的列唯一。这样,当您尝试将重复信息放入其中时,SQL将用Python向您发送一条失败消息

例如,以下表为例:

用户名(唯一) 密码 我的用户名 我的密码 访问mysql

$ mysql -u root -p 
从命令行在mysql上创建数据库和表作为示例

mysql> CREATE DATABASE sof;
查询正常,1行受影响(0.00秒)

数据库已更改

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秒)

查询正常,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)
请注意字段
非唯一
如果索引可以包含重复项,则为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"])
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

输出:

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脚本

输出:

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"])
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

$ mysql -u root -p 
从命令行在mysql上创建数据库和表作为示例

mysql> CREATE DATABASE sof;
查询正常,1行受影响(0.00秒)

数据库已更改

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秒)

查询正常,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)
请注意字段
非唯一
如果索引可以包含重复项,则为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"])
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

输出:

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脚本

输出:

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"])
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)


正如您所看到的,表中没有重复的条目。

创建不希望重复的列。数据库中已经有信息。我的意思是,如果列表中的信息不在数据库中,则应将其添加到数据库中。您应向数据库发送查询以插入它,如果返回值不是
true
,这意味着要么查询错误,要么唯一列已经有了该值。否则它将被插入。如果我不明白你的问题,很抱歉。请把你的答案放在答案部分。谢谢。我已经发布了我的答案。请创建一个不希望重复的列。数据库中已经有信息。我的意思是,如果列表中的信息不在数据库中,则应将其添加到数据库中。您应该向数据库发送一个查询以插入它,如果返回值不是
true
,这意味着要么查询错误,要么唯一列已经具有该值。否则它将被插入。如果我不明白你的问题,很抱歉。请把你的答案放在答案部分。谢谢,我已经发布了我的答案。你的答案是错误的。我只是说我如何在数据库中输入不重复的信息。您的解决方案不起作用。我将在新的答案中尽量清晰详细。您的答案是错误的。我只是说我如何在数据库中输入不重复的信息。您的解决方案不起作用,我将在新的答案中尽量清晰和详细。