永发信息网

sqlite也可以使用数据库的五种约束吗

答案:1  悬赏:0  手机版
解决时间 2021-11-15 04:05
sqlite也可以使用数据库的五种约束吗
最佳答案
一、约束 Constraints
在SQLite数据库中存储数据的时候,有一些数据有明显的约束条件。 比如一所学校关于教师的数据表,其中的字段列可能有如下约束:
年龄 - 至少大于20岁。如果你想录入一个小于20岁的教师,系统会报错.
国籍 - 默认中国。所谓默认,就是如果你不填写,系统自动填上默认值.
姓名 - 不能为空。每个人都有名字嘛.
员工号 - 唯一。这个可不能乱,工资发错了就麻烦了.
上面提到的大于、默认、不能为空、唯一等等,就是数据的约束条件。 我们在用CREATE TABLE 创建表的时候,就应该将每个字段列的约束条件事先说明(如果有的话), 以后再往表里输入数据的时候,系统会自动为我们检查是否满足约束条件,如果不满足系统会报错。
SQLite 数据库常用约束如下:
NOT NULL - 非空
UNIQUE - 唯一
PRIMARY KEY - 主键
FOREIGN KEY - 外键
CHECK - 条件检查
DEFAULT - 默认
二、主键 PRIMARY KEY
我们还是进入SQLite 命令行环境,建立一个 test.db 数据库用来做实验,如下
myqiao@ubuntu:~/My Documents/db$ sqlite3 test.db -- Loading resources from /home/myqiao/.sqliterc SQLite version 3.7.4 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables sqlite>

运行 .tables 命令没有返回,说明数据库是空的。如果你的数据库里面有内容并影响到下面的实验, 你可以用我们上一篇学的 DROp TABLE 来删除造成影响的表, 或者用ALTER TABLE ... RENAME TO ... 来改名。
下面言归正转,我们来说说主键 PRIMARY KEY 。
首先,数据表中每一条记录都有一个主键, 这就像我们每的身份证号码、员工号、银行帐号; 反过来也可以说,每一个主键对应着一条数据记录。 所以,主键必须是唯一的。
其次,一般情况下主键同时也是一个索引,所以通过主键查找记录速度比较快。
第三,在关系型数据库中,一个表的主键可以作为另外一个表的外键, 这样,这两个表之间就通过这个键建立了关系。
最后,主键一般是整数或者字符串,只要保证唯一就行。 在 SQLite 中,主键如果是整数类型,该列的值可以自动增长。
下面我们来做实验:
sqlite> sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text); sqlite> .tables Teachers sqlite> INSERT INTO Teachers(Name) Values('张三'); sqlite> INSERT INTO Teachers(Name) Values('李四'); sqlite> INSERT INTO Teachers(Name) Values('王二麻子'); sqlite> SELECT * FROM Teachers; Id Name ---------- ---------- 1 张三 2 李四 3 王二麻 sqlite> INSERT INTO Teachers(Id,Name) Values(2,'孙悟空'); Error: PRIMARY KEY must be unique sqlite>

我们先新建了一个 Teachers 表,并设置了两个字段列,其中 Id 字段列为主键列。 然后,我们向其中插入三条数据并查询,反馈一切正常。
注意:在插入前三条数据的时候,命令中并没有明确指明 Id 的值,系统自动赋值,并且数值自动增长。
插入第四条数据的时候,我给了一个明确的 Id 编号为 2,因为李四的编号已经是 2 了, 所以系统提示我错误:主键必须唯一。
三、默认值 DEFAULT
有一些特别的字段列,在每一条记录中,他的值基本上都是一样的。只是在个别情况下才改为别的值,这样的字段列我们可以给他设一个默认值。
下面我们来做实验:
sqlite> sqlite> DROp TABLE Teachers; sqlite> .tables sqlite> sqlite> CREATE TABLE Teachers(Id integer PRIMARY KEY,Name text,Country text DEFAULT '中国'); sqlite> .tables Teachers sqlite> INSERT INTO Teachers(Name) Values('张三'); sqlite> INSERT INTO Teachers(Name) Values('李四'); sqlite> INSERT INTO Teachers(Name) Values('王二麻子'); sqlite> INSERT INTO Teachers(Name,Country) Values('孙悟空','天庭'); sqlite> SELECT * FROM Teachers; Id Name Country ---- --------------- --------------- 1 张三 中国 2 李四 中国 3 王二麻子 中国 4 孙悟空 天庭 sqlite>

先把之前的 Teachers 表删除,然后重新创建。这回 Teachers 表多了一个 Country 字段, 并且设置默认值为“中国”,然后我们插入四条数据到 Teachers 表。
前三条数据都没有明确指明 Country 字段的值,只有第四条数据指明了“孙悟空”的 Country 为“天庭”。
查询数据,发现前三条数据都填上了默认值,实验成功。
数据显示有点走样,命令 .width 4 15 15 设置的列宽,可以通过 .show 查看, 可能是因为中文的原因,所以没有对齐。
四、非空 NOT NULL
有一些字段我们可能一时不知到该填些什么,同时它也没设定默认值, 当添加数据时,我们把这样的字段空着不填,系统认为他是 NULL 值。但是还有另外一类字段,必须被填上数据,如果不填,系统就会报错。 这样的字段被称为 NOT NULL 非空字段,需要在定义表的时候事先声明
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
襄阳高新城市管理行政执法局团山中队地址好找
已婚男女平时从不联系没有感情,就是单纯的发
在NBA中谁穿26号球衣?
红尘万张千杯酒,千秋大业一壶茶什么意思
非洲的热带草原气候呈明显的什么形分布
体重每天在下降是什么原因?
鱼对什么
谁知道去邯郸魏县的路程怎么走?
中国邮政(高堰邮政所)地址在什么地方,我要处
从深圳到三亚,可以坐船吗?怎么走?费用怎么
白酒加矿泉水水
各位检桩的前辈高手们,我在桩基深测时,突然
放射化学中g-value是什么意思
卓异双缭碔C块FSL206MR用什么可以代换
麦马相当国内什么大学
推荐资讯
王者荣耀王者之锤钟无艳皮肤怎么获得 王者之
7.18怎么化成分数?
广东有什么香烟?
青岛的经纬度
谁知道麦俊龙,《弱水三千》的歌词???
秋香葱什么时候种,香葱生长条件和环境,
柳州一平南动车25号有票吗
小孩去老乡家玩被她家狗咬了,责任谁来负
塔吊司机证,40岁~5O岁的人可以考证吗?多谢
很大的栗子好吃吗
玉米芯小弓棚畦式栽培每亩地能产多少斤平菇,
逆战塔防技能解析 塔防技能哪个最强
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?