【问题标题】:How can I prevent duplicate information from entering the mysql database?如何防止重复信息进入mysql数据库?
【发布时间】: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,则表示查询错误或唯一列已经具有该值。否则会被插入。如果我不明白你的问题,我很抱歉。
  • 请将您的答案放在答案部分。谢谢
  • 我已经发布了我的答案。

标签: python mysql sql


【解决方案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)
    
    

    如您所见,表格中没有重复的条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      相关资源
      最近更新 更多