sqlite - 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
有没有办法在一次调用中运行整个第一个脚本?
解决方案
推荐阅读
- neo4j - 密码查询:返回某些用户评分的食谱,包含特定成分,按结果中重复的食谱数量排序
- sql - for循环中的状态栏
- javascript - Next.js 按需静态再生
- python - 如何在 python 中制作 2 个字典,在 .txt 文件中用空格分隔
- android - 为什么我的lazyColumn 仅在我转到另一个片段并返回 Android 时才加载?
- azure-devops-rest-api - 什么 REST Api 返回本地 Azure DevOps Server 中给定池的 AGENT.BUILDDIRECTORY 值?
- powershell - 想要检索 CMD 提示中文件中存在的文件名列表的修改日期
- sfml - SFML Sprite 没有显示在窗口上,即使它没有给我任何错误
- c# - WPF C# Listview - 如何在不触发 SelectionChanged 的情况下刷新列表
- sql - BigQuery中如何判断具有多项数据的列具有一个指定值?