新行是基于前一行的数据,如何防止重复


New row is based on the data of prevouse row, how to prevent from duplication

这是表格,

tbl_example:
ID -    unique -   auto increment,
name-   text
num-   Notunique
created  timestamp   curentdatetime

使用php5.5和msyql5.5每次插入时,首先根据更新的插入时间从表中获取num的值。例如,下面是获取最后一列 num value:

的查询

$sql = "SELECT num FROM tbl_example ORDER BY created DESC LIMIT 1"

创建列的时间戳时,插入的新查询将如下所示:
 $sql2 "INSERT INTO tbl_example (name, num) VALUES ('TEMPNAME', $sql1 + 1)"

注意:这里我只在查询中添加了$sql1,它在功能上不返回值,但只使我的问题可以理解。

和这里一样,列num的值将基于$sql1,

的结果。

$question:如果两个用户或三个用户在同一秒相同的时间运行查询,那么$sql1的结果将对他们中的三个相同,因为在$sql2上,数据将插入并且num列的值将对他们中的三个相同,

由于某些原因,我不能保持列num唯一,

在这种情况下,我怎样才能防止重复呢?

到这里,他们解释如何使用lastinsertid。这就是你要找的。

如果你想在一个用分号分隔的查询中完成,这是关于查询和SQL的,而不是Php。

应该这样做:

SET @tmp=(SELECT MAX(NUM)+1 FROM tbl_example);
LOCK TABLES tbl_example READ;
INSERT INTO tbl_example (name, num) VALUES ('TEMPNAME', @tmp);
UNLOCK TABLES;

但你的问题似乎是一个数据库设计和缺乏客户端-服务器和SQL知识…

您可以使用select into来同时执行插入:

INSERT INTO tbl_example (name, num) VALUES (name, num)
  SELECT  tbl_example.name,   Max(tbl_example.num)+1
    FROM tbl_example GROUP BY tbl_example.num

尝试:

INSERT INTO tbl_example (name, num) select 'TEMPNAME', MAX(num)+1 from tbl_example

或者,如果您仍然需要按日期排序:

INSERT INTO tbl_example (name, num) select 'TEMPNAME', num+1 from tbl_example order by created DESC limit 1