sqlite3
表创建后的操作
创建后设置主外键
# 执行原生sql语句
# 设置主键
conn.execute("alter table tableName add constraint p_key_name primary key (index_code)")
# 从表设置外键
conn.execute(f"alter table tableName add foreign key (index_code) references tableName(index_code)")
表的创建时操作
自增主键
CREATE TABLE w_user(
id integer primary key autoincrement, --自增主键
username varchar(32),
);
联合主键设置样式
CREATE TABLE tb_test (
bh varchar(5),
id integer,
ch varchar(20),
--在创建联合主键时,主键创建要放在所有字段最后面,否则也会创建失败
primary key (id,bh));
外键设置
约束外键的时候 如果主表中的 键不是主键 需要在后面添加描述UNIQUE 不然会报 foreign key mismatch 的错误
因为sqlite3外键默认是关闭的,所以你要使用就要先打开:
PRAGMA foreign_keys = ON
CREATE TABLE IF NOT EXISTS parent (
id text PRIMARY KEY NOT NULL UNIQUE);--作为外键,要添加unique(如果不是主键)
CREATE TABLE IF NOT EXISTS child (
id text PRIMARY KEY NOT NULL ,
parentID TEXT,
FOREIGN KEY (parentID") REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE);
ON DELETE 和 ON UPDATE,表示当发生delete和update时,会发生什么行为
- NO ACTION:默认的,表示没有什么行为.
- RESTRICT:当有一个child关联到parent时,禁止delete或update parent
- SET NULL:当parent被delete或update时,child的的关联字段被置为null(如果字段有not null,就出错)
- SET DEFAULT:类似于SET NULL (是不是设置默认值?没有试过)
- CASCADE:将实施在parent上的删除或更新操作,传播给你吧与之关联的child上.
对于 ON DELETE CASCADE, 同被删除的父表中的行 相关联的子表中的每1行,也会被删除.
对于ON UPDATE CASCADE, 存储在子表中的每1行,对应的字段的值会被自动修改成同新的父键匹配