1

これらのテーブルを考えると:

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) valueswhereを実行したいのですが、行ごとに同じで、のようなサブクエリの結果です。後で更新する挿入ではなく、これをすべて1回の挿入で行いたいです。が必要だと思いますが、よくわかりません。namecountry_idselect country_id from country where name = 'Canada'join

アイデア?

4

1 に答える 1

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 ;

サイドキック: 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
);
于 2012-06-05T13:21:51.953 に答える