代码之家  ›  专栏  ›  技术社区  ›  xetra11

无法创建表,因为它们都相互关联。外键约束格式不正确

  •  0
  • xetra11  · 技术社区  · 4 年前

    我有三张相互依存的桌子。因此,我无法创建表,因为外键引用在我放置create语句的任何位置都找不到引用表。

    错误1005-坎恩·塔贝尔 coopr_local . characters 尼克尔泽根
    (错误150“外键约束格式不正确”)

    CREATE TABLE characters 
    (
        id int NOT NULL AUTO_INCREMENT,
        character_0 TEXT,
        character_1 TEXT,
        character_2 TEXT,
        squad_id int,
        PRIMARY KEY (id),
        FOREIGN KEY (squad_id) REFERENCES squads(id)
    );
    
    CREATE TABLE squads_members 
    (
        id int NOT NULL AUTO_INCREMENT,
        character_id int,
        PRIMARY KEY (id),
        FOREIGN KEY (character_id) REFERENCES characters(id)
    );
    
    CREATE TABLE squads 
    (
        id int NOT NULL AUTO_INCREMENT,
        squad_name varchar(255),
        squad_members_id int,
        squad_callsign varchar(10),
        PRIMARY KEY (id),
        FOREIGN KEY (squad_members_id) REFERENCES squads_members(id)
    );
    
    3 回复  |  直到 4 年前
        1
  •  1
  •   Meow    4 年前

    只选择一个表作为没有外键约束的主表,另外两个表作为依赖于主表并具有外键的互补表,如下例所示:

        CREATE TABLE tblAddress (
        AddressID INT NOT NULL Primary Key,
        Country VARCHAR(1000),
        State VARCHAR(1000),
        City VARCHAR(1000),
        Zip VARCHAR(10),
        AddrLine1 VARCHAR(1000),
        AddrLine2 VARCHAR(1000)
    )
    
    CREATE TABLE PersonA (
        PersonID INT NOT NULL Primary Key,
        FirstName VARCHAR(200),
        LastName VARCHAR(200),
        --OtherColumns
        AddressID INT,
    
        CONSTRAINT fk_Address FOREIGN KEY (AddressID)
            REFERENCES tblAddress(AddressID)
    )
    
    CREATE TABLE PersonB (
        PersonID INT NOT NULL Primary Key,
        FirstName VARCHAR(200),
        LastName VARCHAR(200),
        --OtherColumns
        AddressID INT,
    
        CONSTRAINT fk_Address FOREIGN KEY (AddressID)
            REFERENCES tblAddress(AddressID)
    )
    
        2
  •  0
  •   sticky bit    4 年前

    你没有描述你想建模什么,但从我的猜测来看,你可能想建模一些游戏,其中有可以分组的角色。

    为此,你会为小队准备一张桌子:

    CREATE TABLE squads 
                 (id integer
                     NOT NULL
                     AUTO_INCREMENT,
                  name varchar(255),
                  callsign varchar(10),
                  PRIMARY KEY (id));
    

    如果一个角色只能是一个小队的成员,那么角色表中就会有一个对该小队的引用:

    CREATE TABLE characters 
                 (id integer
                     NOT NULL
                     AUTO_INCREMENT,
                  character_0 text,
                  character_1 text,
                  character_2 text,
                  squad integer,
                  PRIMARY KEY (id),
                  FOREIGN KEY (squad)
                              REFERENCES squads
                                         (id));
    

    如果一个角色不能属于多个小队,你就完成了,不需要另一张桌子。

    如果一个角色可能属于多个小队,则角色表中没有对小队的引用:

    CREATE TABLE characters 
                 (id integer
                     NOT NULL
                     AUTO_INCREMENT,
                  character_0 text,
                  character_1 text,
                  character_2 text,
                  PRIMARY KEY (id));
    

    而不是在角色表中引用小队,你会有第三个表,一个链接角色和小队的表:

    CREATE TABLE squads_characters
                 (squad integer,
                  character integer,
                  PRIMARY KEY (squad,
                               character),
                  FOREIGN KEY (squad)
                              REFERENCES squads
                                         (id),
                  FOREIGN KEY (character)
                              REFERENCES characters
                                         (id));
    
        3
  •  0
  •   nbk    4 年前

    首先创建所有表,然后添加外键,

    ALTER TABLE tbl_name
        ADD [CONSTRAINT [symbol]] FOREIGN KEY
        [index_name] (col_name, ...)
        REFERENCES tbl_name (col_name,...)
        [ON DELETE reference_option]
        [ON UPDATE reference_option]
    

    https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html#foreign-key-adding