Подтвердить что ты не робот

Примеры внешних ключей SQLite

Я не эксперт в sql/sqlite.. предположим, что у нас есть две таблицы:

CREATE TABLE child (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
);


CREATE TABLE MyTableB(
  dog TEXT, 
  FOREIGN KEY(dogList) REFERENCES child(id)
);

как будет INSERT? правильно ли мои операции createTable? Я бы хотел: у ребенка может быть более одной собаки у собаки может быть больше детей

* РЕДАКТИРОВАТЬ * * Что, если бы я хотел, чтобы все дети и для каждого ребенка список собак, связанных с этим ребенком? *

4b9b3361

Ответ 1

Многие-To-Many

Чтобы поддерживать ребенка, имеющего ноль или более собак и собак, принадлежащих к ноль или более детей, ваша структура таблицы базы данных должна поддерживать связь Много-ко-многим. Для этого требуются три таблицы:

CREATE TABLE child (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT
);


CREATE TABLE dog (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    dog TEXT
);

CREATE TABLE child_dog {
    child_id INTEGER,
    dog_id INTEGER,
    FOREIGN KEY(child_id) REFERENCES child(id),
    FOREIGN KEY(dog_id) REFERENCES dog(id)
};

Как вставить

Вставка в каждую из трех таблиц должна быть отдельными операторами SQL, но может иметь место в контексте одной и той же транзакции. Вставки в таблицу child_dog (так называемая таблица отображения) должны выполняться после вставки в дочерние и собачьи таблицы. Это происходит по двум причинам:

  • Вам нужно знать идентификаторы как ребенка, так и собаки, чтобы для вставки в эту таблицу.
  • Из-за ограничения внешнего ключа вставка в таблицу child_dog завершилась неудачно, если дочерний элемент и/или ссылка на собаку не существуют в базе данных или транзакции.

Вот некоторые примеры операторов SQL для insert:

INSERT INTO child VALUES(NULL, 'bobby');
SELECT last_insert_rowid(); -- gives the id of bobby, assume 2 for this example
INSERT INTO dog VALUES(NULL, 'spot');
SELECT last_insert_rowid(); -- gives the id of spot, assume 4 for this example
INSERT INTO child_dog VALUES(2, 4);

Вставка в Python

Хотя в вашем вопросе не упоминался python, в этом вопросе есть тег python, поэтому я предполагаю, что вы хотите знать, как это сделать в python. Модуль sqlite3 в python обеспечивает хороший небольшой ярлык, который избавляет вас от необходимости запускать функцию last_insert_rowid().

# Import the sqlite3 module
import sqlite3
# Create a connection and cursor to your database
conn = sqlite3.connect('example.db')
c = conn.cursor()
# Insert bobby
c.execute("""INSERT INTO child VALUES(NULL, 'bobby')""")
# The python module puts the last row id inserted into a variable on the cursor
bobby_id = c.lastrowid
# Insert spot
c.execute("""INSERT INTO dog VALUES(NULL, 'spot')""")
spot_id = c.lastrowid
# Insert the mapping
c.execute("""INSERT INTO child_dog VALUES(?, ?)""", (bobby_id, spot_id));
# Commit
conn.commit()
conn.close()

Ответ 2

для этого вам нужно иметь три таблицы. Это пример Many-to-Many Отношения.

Child
- ChildID (PK)
- Name

Dog
- DogID   (PK)
- DogName

Child_Dog
- ChildID (FK)   
- DogID   (FK)