一个表 testTable,表中只有一列testNumber,数字型。
程序功能:插入1000条记录,从1到1000,不能有重复的数字。
实现方法:
从1到1000循环, 查询表中有没有当前的循环值,如果没有就插入。
实现此功能实际上是有两条sql语句,
一条是查询 select * from testTable where testNumber=5
一条是插入语句 insert into testTable(testNumber) values(5), 如果查询返是没有才执行。
程序在一台终端上运行完全没有问题。
但是如果在两台终端上同时运行此程序就会出现问题了。 插入的记录还是1000条,但是数字不是连续的,中间会有一此数字是重复的。
经过分析发现问题是这样的:
4个动作
1 sql服务器执行了A终端的查询语句,返回了false给A终端
2 sql服务器执行了B终端的查询语句,返回了false给B终端
3 sql服务器执行了A终端的插入语句。
4 sql服务器执行了B终端的插入语句。
所以表中就会出现重复的数字。
怎么样才能让sql执行完动作1后,接着执行动作 3。 就是说查询和插入这两个动作不要被打断(不使用存储过程)?
------解决思路----------------------
那就不要分两句执行,直接执行一次
INSERT INTO testTable(testNumber)
SELECT 5
WHERE NOT EXISTS
(SELECT 1 FROM testTable WHERE testNumber=5)
------解决思路----------------------
在testNumber上建唯一索引。
程序不判断直接进行插入,忽略索引重复的错误。
大数据时用索引去重复比较快。