确保没有重复项保存MySql

时间:2015-08-26 03:09:24

标签: python mysql

我在mySql中有一个看起来像这样的表

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int(11)      | NO   | PRI | NULL    | auto_increment |
| start_of_week | date         | NO   |     | NULL    |                |
| end_of_week   | date         | NO   |     | NULL    |                |
| weekday       | varchar(15)  | NO   |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

我想确保没有重复保存。我知道我可以在这样的事情之前做一个选择陈述

"select count(*) from Table where start_of_week = %s and end_of_week = %s and weekday = %s", (start_date, end_date, a_weekday)

如果返回0,则没有项目,完全相同,所以保存它。但我想知道是否有另一种方式,可能是一种更好的方法来确保不会保存重复项。顺便说一句,我使用python保存到数据库,但我想知道是否有一种方法来设置表来完成这个?或者在python中执行不同的检查?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

只需在private void checkForMp3Recursive(File file) { if (file.isDirectory()) { if (file.listFiles().length > 0) { for (File innerFile : file.listFiles()) { checkForMp3Recursive(innerFile); } } } else if (file.getName().endsWith(".mp3")) { Log.e("tesnyae", file.getPath()); HashMap<String, String> song = new HashMap<String, String>(); song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4)); song.put("songPath", file.getPath()); songList.add(song); } } 上使用复合唯一键,然后像往常一样使用IGNORE关键字执行INSERT / UPDATE查询。

(start_of_week, end_of_week, weekday)列上没有重复项。

start_of_week, end_of_week, weekday

http://dev.mysql.com/doc/refman/5.6/en/insert.html

  

如果使用IGNORE关键字,则忽略执行INSERT语句时发生的错误   例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将被中止。
  使用IGNORE,该行将被丢弃并且不会发生错误   忽略错误可能会生成警告,但重复键错误不会。

您也可能对ODKU感兴趣:https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

答案 1 :(得分:1)

您可以在表中的所有列上创建复合键,然后数据库不允许重复,但不建议这样做,因为您可能遇到聚簇索引大小和性能降低的问题。

您要做的是创建一个代理键,该代码键可以是每行的md5哈希值,然后使用增量主键将其作为主键或复合键。

您可以使用hashlib生成记录的md5哈希值,然后将其存储在表中的md5列中。然后将其作为主键。如果您尝试插入重复的行,它将具有相同的md5值,并且数据库将给您一个错误,因为它是一个重复的键。

请参阅此处了解如何使用hashlib https://docs.python.org/2/library/hashlib.html#module-hashlib

import hashlib
m = hashlib.md5()
m.update(start_of_week) # these would be the values you are storing in the corresponding rows of the table
m.update(end_of_week)
m.update(weekday)
m.digest()

然后将m.digest()存储到md5列中。