Как вставить строку с внешним ключом, который ссылается на составной ключ - PullRequest
0 голосов
/ 25 мая 2019

У меня есть таблица mysql с составным первичным ключом и дочерняя таблица, которая ссылается на первую с внешним ключом.

Каков правильный синтаксис для вставки строки дочерней таблицы?

Как обе части составного ключа задаются в операторе вставки?

У меня есть эти таблицы;

CREATE TABLE IF NOT EXISTS parent (
    p_id    INT NOT NULL,
    p_org   INT NOT NULL,
    PRIMARY KEY(p_id, p_org),
    p_name  VARCHAR(12))
ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS child (
    c_id    INT NOT NULL PRIMARY KEY,
    c_org   INT NOT NULL,
    c_p_id  INT NOT NULL, FOREIGN KEY(c_p_id, c_org) REFERENCES parent(p_id, p_org),
    c_info  VARCHAR(12))
ENGINE=InnoDB;

После вставки двух строк в родительский;

insert into parent values(100, 1, 'name-1'), (100, 2, 'name-2');

Я хочу вставить строку в дочерний элемент.

insert into child values(1000, 2, 100, 'info-for-2');

но я не знаю, как указать составной ключ.Вместо 100 я хотел бы указать (100 и 2), чтобы моя дочерняя строка ссылалась только на родителя с (100 2).

С приведенным выше оператором вставки мой запрос возвращаетдве строки вместо одной;

select * from parent join child on c_p_id = p_id;

возвращает;

p_id    p_org   p_name  c_id    c_org   c_p_id  c_info
100     1       name-1  1000    2       100     info-for-2
100     2       name-2  1000    2       100     info-for-2

, но я хотел бы получить только строку с (100 2).

Буду ли я на самом деле иметьуказать c_org в соединении?

Ответы [ 3 ]

0 голосов
/ 25 мая 2019

Да. Вам нужно указать c_org в соединении, и ваш запрос станет таким:

select * from parent join child on c_p_id = p_id and c_org = p_org;

Это можно увидеть в скрипке

Вы должны сделать это, потому что у вас есть составной внешний ключ.

0 голосов
/ 25 мая 2019

Вы должны начать привыкать явно упоминать целевые столбцы в операторах INSERT.

Затем, если вы вставите строку в parent с помощью

INSERT INTO parent
            (p_id,
             p_org)
            VALUES (2,
                    100,
                    'name-2');

, вывставьте строку в child, которая ссылается на строку в parent, используя точные значения кортежа первичного ключа parent в столбцы кортежа внешнего ключа childs, например

INSERT INTO child
            (c_id,
             c_org,
             c_p_id,
             c_info)
            VALUES (1000,
                    2,
                    100,
                    'info-for-2');

Чтобы соединить строки, необходимо убедиться, что все значения из первичного ключа соответствуют значениям внешнего ключа в предложении ON.Здесь вы можете использовать AND.

SELECT *
       FROM parent p
            INNER JOIN child c
                       ON c.c_p_id = p.p_id
                          AND c.c_org = p.p_org;
0 голосов
/ 25 мая 2019

Да, вы должны указать c_org в соединении:

 select * from parent join child on c_p_id = p_id && c_org = p_org;

Ваш внешний ключ - "c_p_id" и "c_org", а не просто "c_p_id". Вы должны объединить все столбцы внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...