数据库TEXT类型(唯一索引)的办法

数据库过滤重复项需要用到唯一索引,然而如果某列的字符串长度过大,需要用到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()

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

excellent2002

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值