Получить значение из таблицы, чтобы использовать его во вставке - PullRequest
0 голосов
/ 19 мая 2018

Полагаю, этот вопрос уже задавался где-то здесь, но я понятия не имею, как правильно его назвать (и искать).

База данных:

CREATE TABLE department (
    id   INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(100) NOT NULL UNIQUE
);

CREATE TABLE employee (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    department_id INTEGER      NOT NULL,
    chief_id      INTEGER,
    name          VARCHAR(100) NOT NULL UNIQUE,
    salary        INTEGER      NOT NULL,

    FOREIGN KEY (department_id) REFERENCES department (id),
    FOREIGN KEY (chief_id) REFERENCES employee (id)
);

INSERT INTO department (name) VALUES ('sales'), ('it'), ('management');

INSERT INTO employee (department_id, chief_id, name, salary) VALUES
    (3, NULL, 'Owner', 1000000),
    (2, 1, 'Team manager', 9000),
    (2, 3, 'Senior dev #1', 7000),
    (2, 3, 'Senior dev #2', 7000);

Сейчас в вставкеЯ должен вычислить chief_id самостоятельно, но мне любопытно, есть ли возможность получить идентификатор по имени, что-то вроде

SELECT id FROM employee WHERE name = 'Owner' 

и использовать это значение вместо жестко закодированного идентификатора во вставке.

Я пытался поместить оператор выбора вместо идентификатора, но это не работает.

Я использую SQLite.

1 Ответ

0 голосов
/ 19 мая 2018

Вы можете сделать это с подзапросом, как ваш, но данные должны быть в таблице, прежде чем вы сможете выбрать его.В противном случае подзапрос возвращает ноль.Поэтому вам нужно разбить один INSERT на несколько INSERT s.

INSERT INTO employee (department_id, chief_id, name, salary) VALUES
    (3, NULL, 'Owner', 1000000);

INSERT INTO employee (department_id, chief_id, name, salary) VALUES    
    (2, (SELECT id FROM employee WHERE name = 'Owner'), 'Team manager', 9000);

INSERT INTO employee (department_id, chief_id, name, salary) VALUES
    (2, (SELECT id FROM employee WHERE name = 'Team manager'), 'Senior dev #1', 7000),
    (2, (SELECT id FROM employee WHERE name = 'Team manager'), 'Senior dev #2', 7000);

Но обратите внимание, что подзапрос должен возвращать только одну строку.Поэтому столбец, который вы проверяете в своем предложении WHERE, должен содержать уникальные значения.Обычно имя не уникально, здесь много Джона Смита.Обычно идентификатор является уникальным идентификатором.Так что в общем случае вставка идентификатора напрямую является правильным подходом.

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