2012-06-05 35 views
1

鑑於這些表:MySQL的加入爲相同的值上插入

create table country 
(
    country_id integer  primary key auto_increment, 
    name  varchar(16) unique not null 
); 
insert into country(name) values 
    ('USA'), 
    ('Canada'); 

create table network 
(
    network_id integer primary key auto_increment, 
    name  varchar(32) not null, 
    country_id integer references country(country_id) 
     on cascade update 
     on delete restrict 
); 

我想執行的insert into network(country_id, name) values,其中name是值的列表,但country_id爲每個行相同,一個子查詢的結果像select country_id from country where name = 'Canada'。我想在一個插入中完成所有操作,而不是之後更新的插入。我認爲它要求join,但我不確定。

想法?

+1

您如何傳遞名稱列表? – JHS

+0

我正在用'values()'來完成它,因爲之前需要添加一個外鍵。 – Reinderien

回答

1
INSERT INTO network 
    (country_id, name) 
SELECT 
    c.country_id, n.network_name 
FROM 
    (SELECT country_id 
     FROM country 
     WHERE name = 'Canada' 
    ) AS c 
    CROSS JOIN 
    (SELECT 'name1' AS network_name UNION ALL 
     SELECT 'name2' UNION ALL 
     SELECT 'name3' UNION ALL 
     ... 
     SELECT 'nameN' 
    ) AS n ; 

的Sidekick:不要在MySQL內聯定義外鍵,它們是忽略

create table network 
(
    network_id integer primary key auto_increment,  --- PK fine, not ignored 
    name  varchar(32) not null, 
    country_id integer references country(country_id) --- this FK is ignored 
     on cascade update 
     on delete restrict 
); 

定義他們列清單後,分別。我更喜歡在列後面定義主鍵約束:

CREATE TABLE network 
(
    network_id INTEGER  NOT NULL AUTO_INCREMENT, 
    name  VARCHAR(32) NOT NULL, 
    country_id INTEGER  NULL, 

    PRIMARY KEY (network_id), 

    FOREIGN KEY (country_id)    --- FK not ignored 
     REFERENCES country (country_id) 
     ON CASCADE UPDATE 
     ON DELETE RESTRICT 
); 
+0

當我回家時我會試試這個。看來,我最擔心的事情是真實的,到目前爲止,MySQL對PostgreSQL的相當不利。 – Reinderien