LINUX.ORG.RU

[sqlite3] Отношение один ко многим и INSERT.


0

0

Имеется нечто вроде:

CREATE TABLE session (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    ...
);

CREATE TABLE session_event (
    session INTEGER REFERENCES session (id),
    ...
);
Как бы теперь в это вставлять записи? Пытался было делать так:
INSERT INTO session (...) VALUES (...);
INSERT INTO session_event (session, ...) VALUES (last_insert_rowid(), ...), (last_insert_rowid(), ...), (last_insert_rowid(), ...);
Но, как оказалось, sqlite не разрешает более одного кортежа после VALUES. Или может таблицы как-то по другому организовать?


> Но, как оказалось, sqlite не разрешает более одного кортежа после VALUES
Скажу по-секрету, что, кроме mysql, никто не разрешает.

UVV ★★★★★
()

Чем такая запись не устраивает?
INSERT INTO session_event (session, ...) VALUES (last_insert_rowid(), ...);
INSERT INTO session_event (session, ...) VALUES (last_insert_rowid(), ...);
INSERT INTO session_event (session, ...) VALUES (last_insert_rowid(), ...);

aydar ★★★★★
()

select into xxx(col1,col2,col3,...,colN)
select * from (
select x1,y1,z1 from stub union all
select x2,y2,z2 from stub union all
select x3,y3,z3 from stub
)
где stub - табличка-заглушка с одной строкой

no-dashi ★★★★★
()
Ответ на: комментарий от UVV

А постгрес?

postgres=# create table sometest (a int, b int);
CREATE TABLE
postgres=# insert into sometest (a, b) values (1, 1), (2, 2), (3, 3);
INSERT 0 3
postgres=# select * from sometest;
 a | b 
---+---
 1 | 1
 2 | 2
 3 | 3
(3 rows)

postgres=# select version();
                                                version                                                
-------------------------------------------------------------------------------------------------------
 PostgreSQL 8.3.5 on i386-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.3.2 20081007 (Red Hat 4.3.2-6)
(1 запись)

l5k
()
Ответ на: комментарий от UVV

> Скажу по-секрету, что, кроме mysql, никто не разрешает.

откуда дровишки? :)

true_admin ★★★★★
()
Ответ на: комментарий от aydar

Чем такая запись не устраивает?

Тем, что после первого INSERT'а last_insert_rowid() изменится и будет содержать ROWID уже из таблицы session_event.

Спасибо no-dashi за рецепт с UNION ALL. Только last_insert_rowid() почему-то изменяется даже без явных INSERT'ов, при таком запросе:

INSERT INTO session (...) VALUES (...);
INSERT INTO session_event (session, ...)
    SELECT * FROM (SELECT last_insert_rowid(), ... FROM stub UNION ALL
                   SELECT lsat_insert_rowid(), ... FROM stub UNION ALL
                   SELECT last_insert_rowid(), ... FROM stub);
Пришлость сделать stub не совсем фиктивной и хранить в её единственной строке последний id из session:
INSERT INTO session (...) VALUES (...);
UPDATE stub SET id = last_insert_rowid();
INSERT INTO session_event (session, ...)
    SELECT * FROM (SELECT id, ... FROM stub UNION ALL
                   SELECT id, ... FROM stub UNION ALL
                   SELECT id, ... FROM stub);
Выглядит ужасно.

undet
() автор топика
Ответ на: комментарий от Tupoy_Wenduzyatneg

Действительно работает. Спасибо.

undet
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.