Как создать один ко многим в SQLITE3? - PullRequest
5 голосов
/ 25 сентября 2011

Как создать один ко многим в SQLITE3? У меня есть 2 таблицы:

Mans:
_id   name
 1    antony
 2    fred

и

   point
_id   date   point   
 1     23     77
       24     99 

 2     25     78
        5     0

Я не знаю синтаксис SQL, помогите мне, пожалуйста.

Ответы [ 2 ]

11 голосов
/ 07 ноября 2012

Исходя из того, что яккрилин злодей из иллиной креветки-скриллина:

CREATE TABLE (points) points_id INT
FOREIGN KEY(man_id) REFERENCES mans(PrimaryKeyField)
ON DELETE CASCASDE ON UPDATE CASCASDE

Вот пример из реальной жизни.Допустим, у вас есть люди, которые направляют вам бизнес: ваши сотрудники, ваши друзья, местные компании, где вы делаете рекламу, и т. Д. Клиенты, которые приходят, называются «реферальными».Каждый человек считается только одним рефералом, но реферер может отослать много рефералов (например, сотрудник может отослать 20 новых клиентов; сотрудник является вашим реферером, а сотрудник сделал 20 рефералов).Итак, у вас есть 1 рефери и 20 рефералов (один ко многим):

CREATE TABLE referal(                                         
  referal_id INTEGER UNIQUE NOT NULL PRIMARY KEY,           //A customer can only be 1 referal.
  referal_method TEXT,                                      //How were they refered?  By phone?
  referer_id INTEGER ,                                      //Who refered them?
  FOREIGN KEY(referer_id) REFERENCES referer(referer_id));  //Trace more about referer.

Возможно, что реферал ссылается более чем на одного человека, но я думаю, что это стандартная практика ведения бизнеса.компенсировать только одного рефери.Таким образом, вам никогда не нужно указывать двух судей.Это всегда будет отношение 1 к 1 или 1 к многим;поэтому вы должны составить таблицу «1 ко многим».Я не очень хорошо разбираюсь в CASCADE, но я постараюсь выяснить, как это подходит.

На первый взгляд кажется, что ON UPDATE CASCADE ON DELETE CASCADE не относится к моему ответу, потому что удаление последнего реферала должноне удалить реферера.

Глядя на другой пример :

CREATE TABLE all_candy 
   (candy_num SERIAL PRIMARY KEY,
    candy_maker CHAR(25));

CREATE TABLE hard_candy 
   (candy_num INT, 
    candy_flavor CHAR(20),
    FOREIGN KEY (candy_num) REFERENCES all_candy
    ON DELETE CASCADE)

Если вы удаляете леденец из таблицы hard_candy, то вы также удаляетеэто из таблицы all_candy, потому что карамель - это разновидность конфет, а если тип конфет изменился (например, на прекращенные конфеты), то в любом случае необходимо выполнить новую команду INSERT.

Я запустил тестовый пример для ON UPDATE CASCADE и ON UPDATE DELETE в sqlite3, и, похоже, это не имеет никакого эффекта.Возможно, они не работают с механизмом db по умолчанию для sqlite3, но функциональность перечислена на официальном веб-сайте SQLite: очень наглядный и простой в использовании пример ON UPDATE CASCADE от sqlite.org .Прочитайте и посмотрите, что вы думаете.

Это схема, которую я использовал для моего теста:

BEGIN TRANSACTION;
CREATE TABLE candy(id integer primary key not null, name text, description text);
INSERT INTO candy VALUES(1,'Laffy Taffy', 'Delicious, soft candy.');
INSERT INTO candy VALUES(2,'Pop Rocks', 'A candy that explodes in your mouth.');
COMMIT;

BEGIN TRANSACTION;
CREATE TABLE hard_candy(id integer primary key not null, name text, description text, foreign key(id,name,description) references hard_candy ON DELETE CASCADE ON UPDATE CASCADE);
INSERT INTO hard_candy VALUES(2,'Pop Rocks', 'A candy that explodes in your mouth.');
COMMIT;

Запустил различные обновления в поле описания id-2 любой таблицы.

3 голосов
/ 25 сентября 2011

Синтаксис для этого следующий ...

CREATE TABLE (MySecondTable) Foo INT FOREIGN KEY(Foo) REFERENCES MyFirstTable(PrimaryKeyField) ON DELETE CASCASDE ON UPDATE CASCASDE

работает только на v3.6.1 +

Вот документы http://sqlite.org/foreignkeys.html

...