首页 > 解决方案 > 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有没有办法在一次调用中运行整个第一个脚本?

标签: sqlite

解决方案


推荐阅读