2009-09-22 4 views
6

다음과 같은 테이블이 있습니다. 그것은 여전히 ​​MySQL의 2 열 타임 스탬프 기본값 NOW 값 1067

mysql> SELECT @@sql_mode; 
+------------+ 
| @@sql_mode | 
+------------+ 
|   | 
+------------+ 
1 row in set (0.00 sec) 

을주고있다 : here 내 출력을 지적 내 sql_mode은 NO_ZERO_DATE를 포함하지 않는

CREATE TABLE IF NOT EXISTS mytable (
    id INT NOT NULL AUTO_INCREMENT , 
    create_date TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00' , 
    update_date TIMESTAMP NULL DEFAULT NOW() ON UPDATE NOW() , 
    PRIMARY KEY (`parti_id`)) 
ENGINE = InnoDB; 
here을 같이 이제 하나 개의 기본 의 MySQL의 열 제한을 해결하기 위해 나는 팁을 사용 아래 표시된 오류 :

ERROR 1067 (42000) at line xx in file: '/myschema.sql': Invalid default value for 'create_date' 

나는 5.1.37에서 MySQL을 사용합니다. 우분투

어떻게 해결할 수 있습니까? 감사.

답변

12

하나의 테이블 당 CURRENT_TIMESTAMP 또는 NOW()이 기본값 인 타임 스탬프 열만 가질 수 있습니다. 이것은 MySQL의 잘 알려진 버그입니다.

이 문제를 해결하려면 생성 된 열의 기본값을 유효한 타임 스탬프 값으로 설정 한 다음 CRUD 응용 프로그램 코드에 타임 스탬프를 삽입하십시오. 업데이트 된 열 기본값은 NOW() 또는 CURRENT_TIMESTAMP입니다.

참고 자료 : http://dev.mysql.com/doc/refman/5.1/en/timestamp.html

더이 지역에서의 MySQL의 단점을 설명하기 위해 다음 코드를 고려하십시오

CREATE TABLE testing_timestamps (
    id INT NOT NULL AUTO_INCREMENT, 
    pk_id INT NOT NULL, 
    col1 TIMESTAMP DEFAULT 0, 
    col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY(id) 
); 

delimiter $$ 
CREATE TRIGGER testing_timestamps_trigger 
    AFTER INSERT ON testing_timestamps 
    FOR EACH ROW 
    BEGIN 
    UPDATE testing_timestamps SET col1 = NOW() WHERE id = MAX(id); 
    END; 
$$ 
delimiter ; 

INSERT INTO testing_timestamps (id) VALUES (0); 

이 의지 디스플레이의 출력 :

mysql> INSERT INTO testing_timestamps (id) VALUES (0); 
ERROR 1442 (HY000): Can't update table 'testing_timestamps' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

이가 이 인스턴스에서 방아쇠를 사용하면 좋은 일이 될 것이기 때문에 불만입니다.

+0

당신의 MySQL의 버전을 업데이트 시도 할 수 있습니다 현재 시간 소인을 컬럼 초기화, 자동 갱신 값 또는 둘 다를위한 디폴트 값으로 가질 수 있습니다. 현재 시간 소인을 하나의 컬럼에 대한 디폴트 값으로 할 수없고 자동 갱신 값 다른 열을 위해. " –

+0

이것이"버그 "인지 여부에 대한 논쟁은 심각하게 성가시다. 두 번째 열이 자동 업데이트되는 now()의 기본값을 가진 두 개의 타임 스탬프 열이없는 이유는 무엇입니까? 대답은 MySQL이 그렇게하지 않는다는 것입니다. 나는 그 기능을 실제로 부르지 않는다. –

+0

랜디가 답장을 보내 주셔서 감사합니다. 귀하가 제공 한 링크에 대해 알고 있습니다. 난 그냥 해결 방법을 찾습니다. 그러나 인터넷에 표시된 모든 트릭이 작동하지 않는 것 같습니다. –

7

사실, 랜디의 코드는 깨졌습니다. 그것은 돌연변이 방아쇠이기 때문에 작동하지 않습니다. 업데이트를 시작한 테이블은 업데이트 할 수 없습니다. 예를 들어 SESSIONS 테이블을 업데이트하는 경우 UPDATE, INSERT 또는 DELETE 문을 사용하여 트리거의 테이블을 수정할 수 없습니다. 트리거가 연결된 테이블을 수정할 수있는 유일한 방법은 아래와 같이 "NEW"또는 "OLD"접두사를 사용하는 것입니다. (물론 다른 테이블을 자유롭게 업데이트 할 수 있습니다.) 다음은 op가 설명하는 문제를 극복하는 방법의 예입니다.

create table sessions (
    id integer not null, 
    created timestamp not null default 0, 
    updated timestamp not null default 0 
); 

delimiter // 
create trigger bifer_sessions_ts before insert on sessions for each row 
begin 
    set new.created = now(); 
    set new.updated = now(); 
end; 
// 
create trigger bufer_sessions_ts before update on sessions for each row 
begin 
    set new.updated = now(); 
end; 
// 
delimiter ; 
1

이 작업을 수행하고 작동하게하려면 :

col1 TIMESTAMP DEFAULT 0, 

col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 

당신은 단지 값이 쿼리에서 NULL입니다 확인 COL1에 대한 트리거가 필요하지 않습니다. 대답은 인증 안내서에 나와 있습니다.

0

디폴트 TIMESTAMP는 동일한 테이블에 버전 5.6.1 이전의 MySQL에서 지원되지 않습니다.

버전 5.6 이후. + 동일한 테이블에 두 개 이상의 TIMESTAMP 열을 허용합니다. 는 "테이블에있는 하나 개의 TIMESTAMP 컬럼의 경우, 기본 값과 자동 업데이트 값으로 현재 타임 스탬프를 할당 할 수

당신이, 그것은 기능 버그가되지