やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3構文 表制約(primary key, unique, check, foreign key)

 列制約でなく表制約。

成果物

列制約との違い

制約 違い
primary key 複数の列を指定できる
unique 複数の列を指定できる
check 複数の列を参照できる
foreign key 複数の列を指定できる

 細かいところは列制約と同じはず。

名前をつけることができる

constraint 制約名 制約句

 ただしconstraint 制約名は省略できる。名付けず定義できる。

 名前を付けてもSQLite3では意味がない。drop constraintできるならまだしも、できないから。

primary key

pk.sql

create table T(
  A integer,
  B integer,
  constraint pk primary key(A,B)
);

unique

unique.sql

create table T(
  A integer,
  B integer,
  constraint u unique(A,B)
);

check

check.sql

create table T(
  A integer,
  B integer,
  constraint c check(A = 1 and B = 1)
);
insert into T values(0,1);
insert into T values(1,0);
insert into T values(1,1);
select * from T;
Error: near line 6: CHECK constraint failed: c
Error: near line 7: CHECK constraint failed: c
1|1

foreign key

fk.sql

pragma foreign_keys = ON;
create table P(
  A integer,
  B integer,
  constraint pk primary key(A,B)
);
create table C(
  A integer,
  B integer,
  constraint fk foreign key(A,B) references P(A,B)
);
insert into C(0,0); -- 外部制約エラー(親ない)

insert into P(0,0);
insert into C(0,0);
.echo on
select * from C;
select * from P;
Error: near line 12: FOREIGN KEY constraint failed
select * from P;
0|0
select * from C;
0|0

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで