sqlite更改表时保留外键

时间:2018-10-10 06:47:23

标签: sqlite

数据库架构:

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调用来运行整个第一个脚本?

0 个答案:

没有答案