2012-06-19 4 views
1

저는 MySQL에서 테이블을 설정하는 데있어서 새로운 것이므로 할 수있는 것보다 더 많은 일을하고 싶습니다.MySQL : 다중 기본 키 및 자동 증가

복합 기본 키의 일부로 두 개의 열이 있습니다. 하나는 Date이고 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 | 
|-----------------| 

감사

+0

자동 증가가 그렇게 작동하지 않습니다. 따라서 각 날짜의 숫자가 증가하도록 수동으로 이러한 레코드를 삽입해야합니다. – neeraj

+0

내 대답은 아래 참조, InnoDB가 아니라 MyISAM에서 작동합니다. – ppsreejith

답변

2

합니다.

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이 아닙니다. 방금 방아쇠를 당겼습니다.

+2

이것은 잘못되었습니다. 최대 값을 얻기 전에 표를 잠 가야합니다. 그렇지 않다면, 동시에 실행되는 2 개의 트리거는 동일한 식별자를 갖게 될 것입니다. – mavroprovato

+0

글쎄, MyISAM에서 삽입은 동시에 실행되지 않습니다. InnoDB에서는 잠글 수 있습니다. 그래도 좋은 지적. – cypher

3

글쎄, 나를 위해 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 | 
+------------+----+ 

마법과 관련 없음.

+0

그 CREATE 결과 :'오류 코드 : 1075. 잘못된 테이블 정의; 하나의 자동 열만있을 수 있으며 키로 정의되어야합니다. " – Richard

+0

@ 리차드 킹 : 오? 아니, 어떤 버전을 사용하고 있습니까? 5.1.51-log에서 테스트했는데 이전 버전의 mysql 버전에서도 사용했습니다 (mysql 3 이후). 테이블은 MyISAM입니다. –

+1

네,'ENGINE = MyISAM'을 추가했을 때 작동했습니다. – Richard

2

여기가 제대로 작동합니다.

CREATE TABLE `answer`(
    `dates` DATE NOT NULL, 
    `id` mediumint(9) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`dates`,`id`) 
) ENGINE=MyISAM; 

innoDB에 문제가있는 것으로 알려져 있습니다. 희망이 당신을 도와줍니다.

편집 : PHP는 myadmin에

2012-06-19 1 
2012-06-19 2 
2012-06-19 3 
2012-07-19 1 
2012-07-19 2 
2012-08-19 1 

결과.

0

트리거 중 : SELECT ID FROM your_table WHERE Date = DATE (NOW()) INTO max_id; 은 다음과 같아야합니다. SELECT 최대 (ID)부터 your_table WHERE Date = NEW.key_field INTO max_id;

더 나은 것은 키로 잠금됩니다. innodb에서 동시에 삽입하는 것이 더 좋습니다.

관련 문제