Автоинкремент SQLite для псевдонима для ROWID - PullRequest
0 голосов
/ 21 декабря 2011

У меня проблемы с созданием некоторых таблиц в SQLite - несоответствие внешнего ключа. Я хочу, чтобы две таблицы (время и узел) с автоматическим увеличением ID. В таблице узлов я буду ссылаться не на автоматически увеличенный идентификатор, а на другой столбец (NODE_ID). Однако, поскольку я хочу использовать столбцы таблицы Time в качестве одного большого первичного ключа, я подумал об использовании искусственного идентификатора и ссылки на него.

Исходя из этого и в этой документации , я создал столбец идентификатора, для которого мне не нужно устанавливать значения. Это работает. Однако после вставки строки в эту таблицу у меня возникают несоответствия внешнего ключа при добавлении строк в другие таблицы и попытке ссылки на недавно вставленную строку в Time. Я хотел бы знать, почему ...

** Как добавить более одного внешнего ключа в таблицу? Это невозможно в SQLite? **

Мои таблицы:

CREATE TABLE Time (
  ID    integer NOT NULL,
  SECOND    integer NOT NULL,
  MINUTE    integer NOT NULL,
  HOUR      integer NOT NULL,
  M_DAY     integer NOT NULL,
  MONTH     integer NOT NULL,
  YEAR      integer NOT NULL,
  W_DAY     integer NOT NULL,
  Y_DAY     integer NOT NULL,
  IS_DST    integer NOT NULL,  
  SPAN      integer NOT NULL,
  PRIMARY KEY (ID, SECOND, MINUTE, HOUR, M_DAY, MONTH, YEAR, W_DAY, Y_DAY)
);


CREATE TABLE CpuUsage (
  ID       integer NOT NULL,
  NODE_ID  integer NOT NULL,
  TIME_ID  integer NOT NULL,
  CORE_ID  integer NOT NULL,
  USER     integer,
  NICE     integer,
  SYSMODE  integer,
  IDLE     integer,
  IOWAIT   integer,
  IRQ      integer,
  SOFTIRQ  integer,
  STEAL    integer,
  GUEST    integer,
--  /* Compound Primary Keys */
  PRIMARY KEY(ID, NODE_ID, TIME_ID, CORE_ID)
--  /* Foreign keys */
  FOREIGN KEY (NODE_ID)
    REFERENCES Node(NODE_ID)
    ON DELETE CASCADE
    ON UPDATE CASCADE
  FOREIGN KEY (TIME_ID)
    REFERENCES Time(ID)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

CREATE TABLE Node (
  ID        integer NOT NULL,
  NODE_ID   integer NOT NULL,
  PRIMARY KEY (ID, NODE_ID)
);

Это, например, не работает ...

INSERT INTO Time (SECOND,MINUTE,HOUR,M_DAY,MONTH,YEAR,W_DAY,Y_DAY,IS_DST, SPAN) VALUES (13, 20, 13, 21, 11, 1011, 3, 354, 0, 0);

INSERT INTO CpuUsage (NODE_ID, TIME_ID, CORE_ID, USER, NICE, SYSMODE, IDLE, IOWAIT, IRQ, SOFTIRQ, STEAL, GUEST) 
VALUES (1, 1, -1, 394784, 325834, 552058, 2334284, 136542, 2053, 3334, 0, 0 );
...