2016-04-28 96 views
0

mysql新手,感谢任何帮助。从mysql自动增量主键分配外键

我有三个表格:organizationslocationsshows。我想使用organizationslocations的自动增量分配主键作为shows中的外键。当我为该表输入值时,代码mysql如何自动为shows拉外键?或者,当我在shows中输入每行的值时,根据自动递增的主键自动分配的值,手动分配是最佳做法吗?

下面是我创建的所有三个表,都organizationslocations已插入所有条目(并通过自动增量分配因而主键):

组织

CREATE TABLE organizations(
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(64) NOT NULL, 
    sex CHAR(1) NOT NULL, 
    start_year YEAR NOT NULL, 
    end_year YEAR NOT NULL, 
    notes LONGTEXT, 
    PRIMARY KEY (id) 
    ); 

地点

CREATE TABLE locations (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(64) NOT NULL, 
    address_name VARCHAR(64) NOT NULL, 
    address_lat FLOAT(10,6) NOT NULL, 
    address_long FLOAT(10,6) NOT NULL, 
    type VARCHAR(64) NOT NULL, 
    notes LONGTEXT, 
    PRIMARY KEY (id) 
    ); 

显示

CREATE TABLE shows (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    organization_id MEDIUMINT NOT NULL, 
    location_id MEDIUMINT NOT NULL, 
    date DATE NOT NULL, 
    cost DECIMAL (2,2), 
    money_raised DECIMAL (6,2), 
    charity VARCHAR(64), 
    audience_size MEDIUMINT, 
    band VARCHAR(64), 
    blackface CHAR(1), 
    drag CHAR(1), 
    notes LONGTEXT, 
    PRIMARY KEY (id) 
    ); 


ALTER TABLE shows 
    ADD CONSTRAINT FK1_shows 
    FOREIGN KEY (organization_id) REFERENCES organizations(id) 
    ON UPDATE CASCADE 
    ON DELETE CASCADE; 

ALTER TABLE shows 
    ADD CONSTRAINT FK2_shows 
    FOREIGN KEY (location_id) REFERENCES organizations(id) 
    ON UPDATE CASCADE 
    ON DELETE CASCADE; 
+0

表“组织”和“位置”是否有另一个唯一的列值,您在将某个记录插入到show中时知道?例如,'locations.name'?如果不是,你怎么知道你想链接到哪个位置和组织? – trincot

+0

是的,organizational_name和locations_name位于Excel中,对应于表“shows”中的行。 – user2337225

+0

看看'LAST_INSERT_ID()'函数。在使用自动增量插入表格后,它会返回分配的ID。当你用外键插入到表中时,可以使用它。 – Barmar

回答

0

你可以使用它选择ID基于name值的其它表值,像这样的插入语句:

INSERT INTO shows (
    organization_id, 
    location_id, 
    date 
) VALUES (
    (SELECT id FROM organizations WHERE name = 'my_org_name'), 
    (SELECT id FROM locations WHERE name = 'my_loc_name'), 
    '2016-05-01' 
); 

当然,你会插入一些其他列的值。

+0

@ user2337225,这是否解决了您的问题?你可以提供一些反馈吗? – trincot