|
如何强制一个表只有一行?下面是我尝试过的。该UPDATE触发器可以工作,但是,CREATE触发绝对不会。对于CREATE,我想使用SET,但是SETSQLite不支持。
0 ^! ^' K. U* |8 N YCREATE TABLE IF NOT EXISTS `config` (
; U& W0 o5 W1 V `id` TINYINT NOT NULL DEFAULT 0,
3 H: e+ w9 ~% V, Z9 A `subdomain` VARCHAR(45) NOT NULL,7 F9 N7 m7 S2 w! C" m
`timezone` CHAR(3) NOT NULL,
7 p: B6 Q, o# ? `timeout` TINYINT NOT NULL,9 \2 y5 R5 m$ ]* I+ c
`offline` TINYINT NOT NULL,0 N. p1 A p5 r+ c/ z- }8 e J5 g5 e& b
`hash_config` CHAR(32) NOT NULL,
$ i$ [: _5 L4 I- m- l `hash_points` CHAR(32) NOT NULL," V3 p% T% o3 a) x" p
PRIMARY KEY (`id`));0 O5 A! ^- k1 F
INSERT INTO config(id,subdomain,timezone,timeout,offline,hash_config,hash_points) VALUES(0,'subdomain','UTC',5,0,'hash_config','hash_points');: w# S. m8 m. Y- C
CREATE TRIGGER `config_insert_zero`
' Y u% K! X* |( h6 _3 c9 YBEFORE INSERT ON `config`0 Q/ y' |. x$ @0 O# c
FOR EACH ROW
, U- c8 w2 Z" I9 S- lBEGIN5 K# u5 W0 h+ H$ z" `" a' w2 c6 e
-- SET NEW.id=0;
0 l G8 U5 U: V0 a* ]1 g NEW.id=OLD.id;& H: p/ S' P9 c7 ?+ Q+ n
END;
+ _" z9 J% \% g6 r& u7 U+ N! }$ e; ACREATE TRIGGER `config_update_zero`9 u3 q/ C+ p* F
BEFORE UPDATE ON `config`
, R: J( m* f! z! sFOR EACH ROW6 I# o/ _4 `. k' E8 V
BEGIN' {3 t1 s6 B& b- Y4 i J# y
-- SET NEW.id=0;
# g" K. ]# r" S1 P NEW.id=OLD.id;
: Y% f) g. n1 n8 f4 s. QEND;
( y6 Y/ N9 I. H, Y# g2 L: P & R ?& `2 }9 D% W+ k* Q2 A9 H
解决方案:5 N9 r; q7 ~/ ]2 ]0 J$ d4 V8 Q
# I' s7 l3 b4 [3 @- M
8 }- U% V6 b. n* |4 T# ]' q% i
7 C- C5 C# M3 I6 ^ W! j4 i 通常,要限制表中的行数,必须防止任何进一步的插入。在SQLite中,这是通过RAISE()完成的:! B) g/ P6 ~1 }* J
CREATE TRIGGER config_no_insert8 u$ Y6 B' Y7 o+ m
BEFORE INSERT ON config
" s8 x* n/ ~: {9 fWHEN (SELECT COUNT(*) FROM config) >= 1 -- limit here
/ W( B7 ^+ [3 m1 O- E" cBEGIN- s7 n- s$ F7 {8 z& q) ]
SELECT RAISE(FAIL, 'only one row!');& A7 g! n N$ P3 E `% z
END;9 m+ [8 l2 u! {, L* r. V$ {% ?/ U
但是,如果限制为1,则可以简单地将主键约束为固定值:
- T7 {( i% p/ {! W& HCREATE TABLE config (0 r [1 t2 R1 x3 V9 g
id INTEGER PRIMARY KEY CHECK (id = 0),
/ {3 W; O7 Y. B5 ?& X* h [...]
7 U: d+ L3 K& K' H); |
|