数据库过滤重复项需要用到唯一索引,然而如果某列的字符串长度过大,需要用到TEXT类型,就无法直接进行唯一索引,下面是我使用的一种方法
创建一个测试数据库
create database if not exists test
创建数据库下的表格,包含text类型数据:test_col,text类型数据的md5:test_col_md5,
设置test_col_md5为唯一索引
CREATE TABLE if not exists `question` (
`test_col` text NOT NULL,
`test_col_md5` varchar(32) NOT NULL,
UNIQUE KEY `question_unique` (`test_col_md5`)
);
到此为止,test_col_md5是不可重复的,test_col是可重复的
两种插入办法:
第一种(创建触发器):
CREATE TRIGGER if not exists `md5_` BEFORE INSERT ON `question` FOR EACH ROW
begin
set new.test_col_md5=MD5(new.test_col);
end
create trigger if not exists `md5_`:md5_是触发器名字,该句是如果没有该名字触发器,就创建,如果有就不创建。
before insert:在插入数据前,检测插入数据是否符合业务逻辑,如不符合返回错误信息。
for each row:每行都有该触发器。
begin....end:中间写操作内容
创建触发器后,使用insert操作,写入test_col
触发器就会自动执行begin.....end中间的操作
这里使用python代码
import hashlib,pymysql
#连接数据库
mydb=pymysql.connect(
host='localhost',
user='数据库账户',
passwd='数据库密码',
database="test"
)
cur=mydb.cursor() # 获取光标
insert="insert into `question`(`test_col`) values(%s)"
test_col_string='很长的数据' # 长字符串
cur.execute(insert,(test_col_string)) # sql语句写入事件
mydb.commit() # 提交sql语句
#手动关闭数据库
cur.close()
mydb.close()
第二种(使用程序执行insert直接进行操作):
此次使用python代码
import hashlib,pymysql
#连接数据库
mydb=pymysql.connect(
host='localhost',
user='数据库账户',
passwd='数据库密码',
database="test"
)
cur=mydb.cursor() # 获取光标
insert="insert into `question`(`test_col`,`test_col_md5`) values(%s,%s)"
test_col_string='很长的数据' # 长字符串
md=hashlib.md5() # 获取md5算法对象
md.update(test_col_string.encode('utf-8'))
test_col_md5_string=md.hexdigest() # 长字符串的MD5
cur.execute(insert,(test_col_string,test_col_md5_string)) # sql语句写入事件
mydb.commit() # 提交sql语句
#手动关闭数据库
cur.close()
mydb.close()