我在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中执行不同的检查?
感谢您的帮助。
答案 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列中。