我写了下面的计数代码,目的是让它为我的数据生成自动序列号,而不是删除行后的MySQL序列号。但当我运行它时,我没有发现MySQL表中有任何条目。后来我将代码更改为Dreamweaver Insert Record,在那里我观察到SN(序列号)字段不需要为NULL。
通过要求我在发布前在序列号字段中输入值,这意味着这行代码:"$query=……"one_answers"$SN=…"将不会生成预期的值。
因此,原则上我需要关于如何生成从1到将要创建的数据的自动序列号的帮助。
<?php
if(isset($_POST['submit']))
{
$query = mysql_query("SELECT COUNT(*) as counter FROM tbl_donors");
$sn = mysql_num_rows($query) + 1;
$donorname = $_POST['donorname'];
$designation = $_POST['designation'];
$address = $_POST['address'];
$city = $_POST['city'];
$state = $_POST['state'];
$country = $_POST['country'];
$phone = $_POST['phone'];
$emailaddr = $_POST['emailaddr'];
$user_name = $_POST['user_name'];
mysql_select_db ($database_xxxxxxxxxx,$xxxxxxxxxx);
$query = ("INSERT INTO tbl_donors (donor_id, sn, donorname, designation, address , city, state, country , phone, emailaddr, user_name) VALUES ('', '$sn', '$donorname' , '$designation', '$address', '$city' , '$state', '$country', '$phone, '$emailaddr', '$user_name')");
$results = mysql_query($query,$xxxxxxxxxx) or die
("Could not execute query : $query." . mysql_error());
mysql_close();
}
?>
您需要配置MySQL表,以便sn
列启用AUTO_INCREMENT
。考虑AUTO_INCREMENT
:上MySQL 5.0参考中的这个例子
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');
SELECT * FROM animals;
退货:
+----+---------+
| id | name |
+----+---------+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
+----+---------+
在本例中,没有任何内容作为id
传递,但结果是自动生成的。
您应该为表中的sn
列定义一些链接。
编辑:假设你绝对觉得自己有一个额外的、偏移的、递增的列,一个选项是让它出现,所以当你查询表时。在上面的例子中,假设我们想要一个额外的列sn
,并且id
和sn
之间的差是7。我们可以做以下事情:
SELECT *, (`id` + 7) as `sn` FROM animals;
退货:
+----+---------+----+
| id | name | sn |
+----+---------+----+
| 1 | dog | 8 |
| 2 | cat | 9 |
| 3 | penguin | 10 |
| 4 | lax | 11 |
| 5 | whale | 12 |
| 6 | ostrich | 13 |
+----+---------+----+
请注意,尽管可以在JOIN
s和其他语句中使用sn
,但在其他表中不能将其用作外键。
在MySQL中,每个表只能有一个自动递增字段。这是生成唯一值的正确方法,就像您为每一行所要求的那样。
http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
你使用的方法很容易出错。当你测试它时,它可能会工作,但当它被多个用户使用时,它会导致重复的id。这是因为,如果用户和用户同时被请求,他们将同时获得计数,加1,然后插入相同的值。使用自动递增字段可以避免此问题。它也更快速、更容易使用。
[编辑]
用户询问是否没有其他方法可以做到这一点。当然,还有其他方法可以做到这一点,但这在几乎所有情况下都是正确的。即使每个表需要多个表,在MySQL中最好的方法可能是创建第二个表来获得另一个自动增量。
也就是说,我将提出许多备选方案中的两个。问题的关键是需要一个原子计数器,即一个不受上述竞争条件影响的计数器,并且总是返回下一个唯一的id。原子计数器的一个这样的来源是memcache。Memcache提供了一个原子增量,可以用作唯一id的源。与所有解决方案一样,它也会下降,如果你的Memcache坏了,你会失去状态,计数器会重新启动,因此不会那么唯一。
另一种方法是使用MySQL锁。这可以是一个表锁,在其中锁定表,选择最大id增量,插入和解锁表,这也需要使用事务,因此会使可能非常简单的代码更加复杂。您也可以使用MySQL的任意应用程序级锁定方案。
https://dev.mysql.com/doc/refman/5.0/en/internal-locking.htmlhttps://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_get-锁定
实现这样一个替代方案的复杂性已经足够了,如果你还不知道我刚才解释的内容,你应该坚持使用自动增量字段,它们非常容易使用,而且非常防弹。