Схема базы данных:
CREATE TABLE accounts (
id INTEGER NOT NULL
PRIMARY KEY AUTOINCREMENT,
name VARCHAR NOT NULL
UNIQUE
);
CREATE TABLE account_info (
account_id INT REFERENCES accounts (id) ON DELETE SET NULL
ON UPDATE CASCADE
);
INSERT INTO accounts (name) VALUES ('Tom');
INSERT INTO account_info (account_id) VALUES (1);
SQLiteStudio генерирует изменяющуюся таблицу sql, как показано ниже, и она работает , строка в account_info все еще существует после выполнения ниже sql.
PRAGMA foreign_keys = OFF;
DROP TABLE IF EXISTS `accounts_temp_table`;
CREATE TABLE `accounts_temp_table` AS SELECT * FROM `accounts`;
DROP TABLE IF EXISTS accounts;
CREATE TABLE `accounts` (
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`name` VARCHAR NOT NULL UNIQUE
);
INSERT INTO `accounts`(`id`, `name`)
SELECT `id`, `name`
FROM `accounts_temp_table`;
DROP TABLE accounts_temp_table;
PRAGMA foreign_keys = ON;
Но, если я использую 'alter table ', как показано ниже, строка в account_info изменится на NULL:
PRAGMA defer_foreign_keys = OFF;
DROP TABLE IF EXISTS `accounts_new_table`;
CREATE TABLE `accounts_new_table` (
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`name` VARCHAR NOT NULL UNIQUE
);
INSERT INTO `accounts_new_table`(`id`, `name`)
SELECT `id`, `name`
FROM `accounts`;
DROP TABLE `accounts`;
ALTER TABLE `accounts_new_table` RENAME TO `accounts`;
PRAGMA defer_foreign_keys = ON;
Это потому, что я использую 'ALTER TABLE' вместовоссоздание таблицы?
Есть ли способ запустить весь первый скрипт за один sqlite3_exec
вызов?