MySQL:多个主键和自动递增

MySQL:多个主键和自动递增,mysql,auto-increment,composite-primary-key,Mysql,Auto Increment,Composite Primary Key,我对在MySQL中设置表很陌生,我想做一些比我能做的更先进的事情 作为复合主键的一部分,我有两列,一列是日期,一列是ID,我希望是一个自动递增的整数。对于每个日期,我都希望将自动整数重置为0,如下所示: |-----------------| |Date | ID | |-----------------| |2012-06-18 | 1 | |2012-06-18 | 2 | |2012-06-18 | 3 | |2012-06-19 | 1 | |2012-06

我对在MySQL中设置表很陌生,我想做一些比我能做的更先进的事情

作为复合主键的一部分,我有两列,一列是日期,一列是ID,我希望是一个自动递增的整数。对于每个日期,我都希望将自动整数重置为0,如下所示:

|-----------------|
|Date       | ID  |
|-----------------|
|2012-06-18 | 1   |
|2012-06-18 | 2   |
|2012-06-18 | 3   |
|2012-06-19 | 1   |
|2012-06-19 | 2   |
|2012-06-20 | 1   |
|-----------------|

谢谢

您可以创建插入前触发器

DELIMITER $$
CREATE TRIGGER `composite_auto_increment` BEFORE INSERT ON `your_table`
FOR EACH ROW
BEGIN
    DECLARE max_id INT(11); -- add the appropriate column length from your table definition
    SELECT ID FROM `your_table` WHERE `Date` = DATE(NOW()) INTO max_id;
    SET NEW.ID = IF(ISNULL(max_id), 1, max_id + 1);
END$$

这样,如果当天已存在和ID,则它将递增。如果没有,则设置为1。请注意,在此场景中,ID在表定义中不是
AUTO_INCREMENT
。它只是由触发器来完成。

好吧,对我来说,mysql会自动完成你想要的

mysql> CREATE TABLE TestData(Date date not null, ID int unsigned not null auto_increment, PRIMARY KEY(Date, ID));

mysql> INSERT INTO TestData SET Date = "2012-06-18";
mysql> INSERT INTO TestData SET Date = "2012-06-18";
mysql> INSERT INTO TestData SET Date = "2012-06-18";
mysql> INSERT INTO TestData SET Date = "2012-06-19";
mysql> INSERT INTO TestData SET Date = "2012-06-19";
mysql> INSERT INTO TestData SET Date = "2012-06-20";

mysql> select * from TestData;
+------------+----+
| Date       | ID |
+------------+----+
| 2012-06-18 |  1 |
| 2012-06-18 |  2 |
| 2012-06-18 |  3 |
| 2012-06-19 |  1 |
| 2012-06-19 |  2 |
| 2012-06-20 |  1 |
+------------+----+
不需要魔法。

在这里,这应该是可行的

CREATE TABLE  `answer`(
  `dates` DATE NOT NULL,
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`dates`,`id`)
) ENGINE=MyISAM;
众所周知,它会导致innoDB出现问题。希望这对你有帮助

编辑:结果

2012-06-19  1
2012-06-19  2
2012-06-19  3
2012-07-19  1
2012-07-19  2
2012-08-19  1
在php myadmin上。

在触发器中: 从
your_table
中选择ID,其中
Date
=Date(NOW())进入max_ID; 必须是: 从
您的\u表
中选择max(ID),其中
日期
=NEW.key\u字段进入max\u ID

但最好是用钥匙锁着。
这对于innodb上的并发插入更好。

Auto increment不是这样工作的。因此,您必须手动插入这些记录,以使每个日期的数字递增。请参见下面的我的答案,它适用于MyISAM,而不是InnoDB。这是错误的,您需要在获取最大值之前锁定表。否则,同时运行的两个触发器将获得相同的标识符。在MyISAM中,插入不会同时运行。在InnoDB中,您可以锁定。但这一点很好。这将导致:
错误代码:1075。表定义不正确;只能有一个自动列,必须将其定义为键。
@RichardKing:噢?不适合我,你用的是什么版本?在5.1.51-log上测试过,也在老版本mysql上使用过(从mysql 3开始)。这张桌子是MyISAM,谢谢。使用
ENGINE=MyISAM
解决了我的问题。