Экспо sqlite иностранный ключ - PullRequest
0 голосов
/ 19 марта 2019

Кто-нибудь работал над реакцией базы данных sqlite нативной выставки с ограничениями внешнего ключа?Можем ли мы использовать структуру, аналогичную sql?

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

Пример: если у нас есть 2 таблицы Persons и Orders, на которые ссылается personIDв качестве внешнего ключа в таблице заказов.Как бы это сделать с помощью sqlite?

1 Ответ

0 голосов
/ 19 марта 2019

У вас будет две таблицы, возможно, с столбцом в качестве псевдонима столбца rowid , это

например

CREATE TABLE persons (
    personid INTEGER PRIMARY KEY, 
    personname TEXT
);

CREATE TABLE orders (
    orderid INTEGER PRIMARY KEY, 
    ordername TEXT, 
    person_reference INTEGER REFERENCES persons(personid)
);
  • Обратите внимание , что вам нужно включить обработку внешнего ключа, например, выполнив PRAGMA foreign_keys = ON; (или true).См. PRAGMA foreign_keys
  • в кодировке SQLite column_name INTEGER PRIMARY KEY определяет этот столбец как псевдоним rowid столбец , и если значение не являетсядля столбца при вставке, тогда будет назначено целочисленное значение.Начальное значение для первой строки будет равно 1, последующие значения будут , как правило, на 1 больше, чем наибольшее значение rowid (прочитайте ссылку выше, чтобы узнать, почему слово обычно использовалось).

Если вы попытаетесь вставить ордер для несуществующего персоны, вы получите конфликт с внешним ключом.

Альтернативой определению на уровне столбца будет определениевнешний ключ (и) на уровне таблицы, например,

CREATE TABLE orders (
    orderid INTEGER PRIMARY KEY, 
    ordername TEXT, 
    person_reference INTEGER, 
    FOREIGN KEY (person_reference) REFERENCES persons(personid)
);

В качестве примера рассмотрим следующее: -

INSERT INTO persons (personname) VALUES 
    ('Fred'),
    ('Mary'),
    ('Sue'),
    ('Tom')
;
INSERT INTO orders (ordername, person_reference) VALUES
    ('Order 1 for Fred',1),
    ('Order 2 for Sue',3),
    ('Order 3 for Fred',1),
    ('Order 4 for Mary',2)
;   
INSERT into orders (ordername, person_reference) VALUES
    ('Order 5 for nobody',100);

Результат будет: -

INSERT INTO persons (personname) VALUES ('Fred'),('Mary'),('Sue'),('Tom')
> Affected rows: 4
> Time: 0.453s


INSERT INTO orders (ordername, person_reference) VALUES
  ('Order 1 for Fred',1),('Order 2 for Sue',3),('Order 3 for Fred',1),('Order 4 for Mary',2)
> Affected rows: 4
> Time: 0.084s


INSERT into orders (ordername, person_reference) VALUES
  ('Order 5 for nobody',100)
> FOREIGN KEY constraint failed
> Time: 0s

т. Е. Последний, поскольку в таблице персон нет строки с персоной 100, то последняя вставка (на собственной демонстрации) завершается неудачей.

Возможно, вы захотитесм. Поддержка внешнего ключа SQLite

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