Примеры внешних ключей 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? Я хотел бы иметь: у ребенка может быть более одной собаки, у собаки может быть больше детей

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

Многие-ко-многим

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

 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 (так называемая таблица сопоставления ) должны выполняться после вставки в дочерние и собачьи таблицы. Это происходит по двум причинам:

  1. Вам нужно знать идентификаторы как ребенка, так и собаки, чтобы вставить в эту таблицу.
  2. Из-за ограничения внешнего ключа вставка в таблицу 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() 

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

 Child - ChildID (PK) - Name Dog - DogID (PK) - DogName Child_Dog - ChildID (FK) - DogID (FK)