powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / insert в связанные таблицы
9 сообщений из 9, страница 1 из 1
insert в связанные таблицы
    #39142329
G00dWINe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Имеется две таблицы.
Системные блоки:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE sb (
    id      INTEGER NOT NULL
                    PRIMARY KEY AUTOINCREMENT
                    UNIQUE,
    sb_name TEXT,
    sn_type TEXT,
    sn      TEXT,
    serv    INTEGER,
    id_room INTEGER REFERENCES room (id) ON DELETE CASCADE
                                         ON UPDATE CASCADE,
    id_hard INTEGER REFERENCES hard (id) ON DELETE CASCADE
                                         ON UPDATE CASCADE,
    id_szi  INTEGER REFERENCES szi (id) ON DELETE CASCADE
                                        ON UPDATE CASCADE
);


Помещения:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE room (
    id        INTEGER NOT NULL
                      PRIMARY KEY AUTOINCREMENT
                      UNIQUE,
    room_type TEXT,
    num       TEXT,
    floor     INTEGER
);



Они, соответственно, связаны по id_room. Также есть еще таблицы, связанные с "sb", но о них в данном случае не говорим.
Задача простая: вставить запись в обе таблицы, а именно вставить данные в следующие поля: sb.sb_name, room.room_type, room.num, room.floor.

Выполняю запрос:
Код: sql
1.
2.
INSERT INTO room (room_type, num, floor) VALUES ("Каб.", "5", "1");
INSERT INTO sb (sb_name, id_room) VALUES ("ИМЯ компьютера", last_insert_rowid());



На то вылезает ошибка:
Ошибка при выполнении SQL запроса к базе данных 'database': FOREIGN KEY constraint failed

В чем может быть проблема? :(

PS: все телодвижения выполняю в SQLiteStudio
...
Рейтинг: 0 / 0
insert в связанные таблицы
    #39142333
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. ошибка при выполнении запроса 2?

Код: sql
1.
2.
INSERT INTO room (room_type, num, floor) VALUES ("Каб.", "5", "1");
INSERT INTO sb (sb_name, id_room) VALUES ("ИМЯ компьютера", last_insert_rowid());



2. что вернет last_insert_rowid() после первого запроса?
...
Рейтинг: 0 / 0
insert в связанные таблицы
    #39142337
G00dWINe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Winnipuh,
да, ошбка после второго запроса.
Данная переменная возвращает id последней добавленной записи ( https://www.sqlite.org/c3ref/last_insert_rowid.html)
...
Рейтинг: 0 / 0
insert в связанные таблицы
    #39142340
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
G00dWINeWinnipuh,
да, ошбка после второго запроса.
Данная переменная возвращает id последней добавленной записи ( https://www.sqlite.org/c3ref/last_insert_rowid.html)

не совсем так, но я в курсе, а что она возвращает в вашем случае ?
ид добавленной записис, которая должна быть FK во втором запросе?
...
Рейтинг: 0 / 0
insert в связанные таблицы
    #39142422
G00dWINe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Winnipuh, да, так и планировалось использовать данную конструкицю
...
Рейтинг: 0 / 0
insert в связанные таблицы
    #39142510
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
G00dWINe,

Убери UNIQUE в определении id полей.
...
Рейтинг: 0 / 0
insert в связанные таблицы
    #39142594
G00dWINe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlG00dWINe,

Убери UNIQUE в определении id полей.

Это действие проблему не решило.

Проблема была в, видимо, баге SQLiteStudio, который не позволяет выполнять сразу две команды, написанные через ";" в одном SQL-редакторе запросов. Если выполнить данные команды раздельно (в разных SQL-редакторах), то все работает.
...
Рейтинг: 0 / 0
insert в связанные таблицы
    #39142599
G00dWINe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня тут возник следующий вопрос!

Как избавиться от дублирования записей в дочерней таблице?

Допустим, мы добавляем записи этим запросом, но в одном помещении находится несколько компьютеров?

Если выполнить два раза эту sql-конструкцию, то в таблицу sb внесутся две записи, ссылающиеся на разные записи в room (которые в room будут одинаковыми, различия будут лишь в id).
...
Рейтинг: 0 / 0
insert в связанные таблицы
    #39142838
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
G00dWINeУ меня тут возник следующий вопрос!

Как избавиться от дублирования записей в дочерней таблице?

Допустим, мы добавляем записи этим запросом, но в одном помещении находится несколько компьютеров?

Если выполнить два раза эту sql-конструкцию, то в таблицу sb внесутся две записи, ссылающиеся на разные записи в room (которые в room будут одинаковыми, различия будут лишь в id).Нет, тогда ты получишь фигню на втором компьютере.

Код: sql
1.
2.
3.
INSERT INTO room (room_type, num, floor) VALUES ("Каб.", "5", "1");
INSERT INTO sb (sb_name, id_room) VALUES ("первый компьютер", last_insert_rowid()); -- last_insert_rowid() = room.id
INSERT INTO sb (sb_name, id_room) VALUES ("второй компьютер", last_insert_rowid()); -- last_insert_rowid() = sb.id


Так что, проще всего не используй эту функцию напрямую. Делай что-то в духе:
Код: sql
1.
2.
3.
4.
5.
sql.execute ( 'INSERT INTO room (room_type, num, floor) VALUES ("Каб.", "5", "1")' )
set rs = sql.query ( 'SELECT last_insert_rowid()' )
room_id = rs.field(0)
sql.execute ( 'INSERT INTO sb (sb_name, id_room) VALUES ("первый компьютер",' + room_id +' )' )
sql.execute ( 'INSERT INTO sb (sb_name, id_room) VALUES ("второй компьютер",' + room_id +' )' )
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / insert в связанные таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]