原建表語句在列定義後直接跟 CONSTRAINT ... PRIMARY KEY、FOREIGN KEY、CHECK 等表級約束,導致語法錯誤。MySQL 要求所有列定義完成後,再集中聲明表級約束。
CREATE TABLE ACCOUNT(
ID INT(4) CONSTRAINT ACCOUNT_ID_PK PRIMARY KEY, -- 列級約束寫法不標準
RECOMMENDER_ID INT(4) CONSTRAINT ... REFERENCES ACCOUNT(ID), -- 外鍵不能寫在列後
...
);
CREATE TABLE ACCOUNT(
ID INT(4) NOT NULL,
RECOMMENDER_ID INT(4),
LOGIN_NAME VARCHAR(30) NOT NULL,
LOGIN_PASSWD VARCHAR(30) NOT NULL,
STATUS CHAR(1),
CREATE_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PAUSE_DATE DATE,
CLOSE_DATE DATE,
REAL_NAME VARCHAR(20) NOT NULL,
IDCARD_NO CHAR(18) NOT NULL,
BIRTHDATE DATE,
GENDER CHAR(1),
OCCUPATION VARCHAR(50),
TELEPHONE VARCHAR(15) NOT NULL,
EMAIL VARCHAR(50),
MAILADDRESS VARCHAR(50),
ZIPCODE CHAR(6),
QQ VARCHAR(15),
LAST_LOGIN_TIME DATE,
LAST_LOGIN_IP VARCHAR(15),
-- 表級約束統一放在最後
CONSTRAINT ACCOUNT_ID_PK PRIMARY KEY (ID),
CONSTRAINT ACCOUNT_RECOMMENDER_ID_FK FOREIGN KEY (RECOMMENDER_ID) REFERENCES ACCOUNT(ID),
CONSTRAINT ACCOUNT_LOGIN_NAME_UK UNIQUE (LOGIN_NAME),
CONSTRAINT ACCOUNT_INCARD_NO_UK UNIQUE (IDCARD_NO),
CONSTRAINT ACCOUNT_STATUS_CK CHECK (STATUS IN ('0','1','2')), -- 注意 CHAR 需引號
CONSTRAINT ACCOUNT_GENDER_CK CHECK (GENDER IN ('0','1'))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CHECK 約束,舊版僅解析不生效。CHAR(1) 存儲 '0'/'1' 時 IN 列表需用字符串。ENGINE=InnoDB 必須顯式指定。