首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MySQL 建表報錯:約束定義語法順序錯誤修正指南

     編輯:程式設計綜合問答

原建表語句在列定義後直接跟 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;

注意事項

  • MySQL 8.0.16+ 才真正強制執行 CHECK 約束,舊版僅解析不生效。
  • CHAR(1) 存儲 '0'/'1' 時 IN 列表需用字符串。
  • 外鍵要求父表已存在且引用列有索引,ENGINE=InnoDB 必須顯式指定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved