5

我对在 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   |
|-----------------|

谢谢

4

4 回答 4

6

这应该工作。

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 上。

于 2012-06-19T12:10:53.413 回答
5

好吧,对我来说,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 |
+------------+----+

不涉及魔法。

于 2012-06-19T12:06:24.930 回答
3

您可以创建一个插入前触发器。

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表定义中。它只是由触发器完成。

于 2012-06-19T11:34:16.790 回答
0

在触发器中:SELECT ID FROM your_tableWHERE Date= DATE(NOW()) INTO max_id; 必须是: SELECT max(ID) FROM your_tableWHERE Date= NEW.key_field INTO max_id;

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

于 2013-08-06T11:24:22.803 回答