数据库架构:
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,它有效,在sql下执行后,account_info中的行仍然存在。
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
调用来运行整个第一个脚本?