如何在MySQL中创建具有自引用字段的表?

时间:2016-02-25 16:40:07

标签: mysql foreign-keys create-table self-reference gtfs

在GTFS中,字段stop_id来自NULL(自我引用)或parent_station。例如(请注意NULL可能是SELECT stop_id, stop_name, parent_station FROM stops where stop_id='1970324837184617' OR parent_station='1970324837184617'; +------------------+----------------------+------------------+ | stop_id | stop_name | parent_station | +------------------+----------------------+------------------+ | 1970324837184617 | Saint Agne-SNCF | | | 3377699720880648 | Saint Agne-SNCF | 1970324837184617 | | 3377699720880649 | Saint Agne-SNCF | 1970324837184617 | | 3377699722011100 | Saint Agne-SNCF | 1970324837184617 | | 3377699722011101 | Saint Agne-SNCF | 1970324837184617 | | 3377699722914835 | Saint Agne Gare SNCF | 1970324837184617 | +------------------+----------------------+------------------+ 6 rows in set (0,01 sec) ),

CREATE TABLE `stops` (
    stop_id VARCHAR(255) NOT NULL PRIMARY KEY,
    stop_code VARCHAR(255),
    stop_name VARCHAR(255),
    stop_desc VARCHAR(255),
    stop_lat DECIMAL(8,6),
    stop_lon DECIMAL(8,6),
    location_type INT(2),
    parent_station VARCHAR(255),
    -- the field `parent_station` might be blank (NULL)
    FOREIGN KEY parent_station REFERENCES stops(stop_id)  -- self-referential table fields
);

我创建了一个自引用表:

FOREIGN KEY (parent_station) REFERENCES stops(stop_id) 

但遇到问题,

  

第99行的错误1064(42000):您的SQL语法出错;检查与您的MySQL服务器版本对应的手册,以便在'FOREIGN KEY之前使用正确的语法`parent_station REFERENCES stop(stop_id)
  )'第11行

在@Awita的帮助下,我更正了语法并成功创建了表。

LOAD DATA LOCAL INFILE 'stops.txt' INTO TABLE stops FIELDS TERMINATED BY ',' IGNORE 1 LINES;

但是在加载本地数据时会出现一个新问题。

ERROR 1452 (23000) at line 140: Cannot add or update a child row: a foreign key constraint fails (`paris_gtfs`.`stops`, CONSTRAINT `stops_ibfk_1` FOREIGN KEY (`parent_station`) REFERENCES `stops` (`stop_id`))

错误:

parent_station

此问题是由 NULL .validate()

引起的

2 个答案:

答案 0 :(得分:5)

这是一个简单的语法错误。试试这个:

FOREIGN KEY (parent_station) REFERENCES stops(stop_id) 

答案 1 :(得分:1)

我尝试使用此命令创建表后添加外键,它可以正常工作:

ALTER TABLE stops
ADD FOREIGN KEY (parent_station)
REFERENCES stops(stop_id)