为了账号安全,请及时绑定邮箱和手机立即绑定

表级约束和列级约束

创建表的语法我在官方的文档中看到了这样的


CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name    (create_definition,...)

1. 上面语法中的create definition可以为是 col_name column_definition,对应下面列举的第一个

create_definition:    col_name column_definition  | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)      [index_option] ...  | {INDEX|KEY} [index_name] [index_type] (index_col_name,...)      [index_option] ...  | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]      [index_name] [index_type] (index_col_name,...)      [index_option] ...  | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)      [index_option] ...  | [CONSTRAINT [symbol]] FOREIGN KEY      [index_name] (index_col_name,...) reference_definition  | CHECK (expr)

1中col_name column_definition的column_definition 可以是[reference_definition],对应下面列举的最后一个

column_definition:    data_type [NOT NULL | NULL] [DEFAULT default_value]      [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]      [COMMENT 'string']      [COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]      [STORAGE {DISK|MEMORY|DEFAULT}]      [reference_definition]

2中的[reference_definition]可以使用下面的语法

reference_definition:    REFERENCES tbl_name (index_col_name,...)      [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]      [ON DELETE reference_option]      [ON UPDATE reference_option]

那么问题来了我这么写为什么不行?t1已经定义了和t2相同的结构

CREATE TABLE t2(

id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,

username VARCHAR(20) REFERENCES t1(username)

);


create_definition:    col_name column_definition

username VARCHAR(20) REFERENCES t1(username) 对应 create_definition

username 对应 col_name  

VARCHAR(20) REFERENCES t1(username) 对应column_definition


column_definition:   data_type   [reference_definition]

VARCHAR(20) 对应 data_type 

REFERENCES t1(username) 对应  [reference_definition]

reference_definition对应如下的语法。

reference_definition:    REFERENCES tbl_name (index_col_name,...)      [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]      [ON DELETE reference_option]      [ON UPDATE reference_option]



最后再问一下,外键约束有几种声明方式,表级约束和列级约束还是没搞懂,老师说的那个可以在列定义时声明,也可以在列定以后声明,什么是定义时,什么是定以后?

例如:

CREATE TABLE t2(

    -> id TINYINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

    -> name VARCHAR(10) NOT NULL,

    -> pid TINYINT UNSIGNED ,

    -> FOREIGN KEY(pid) REFERENCES t1(id)

    -> );

这个是定以时还是定以后?定义时是写在一个语句中还是在一个括号中?老师说的NOT NULL 和 DEFAULT约束只能是列级约束,意思是只能在一条语句中连着写,比如name VARCHAR(10) NOT NULL? 


正在回答

2 回答

回复 慕粉1720382552:最近准备面试java用到了数据库相关的知识,大学4年,2年C++,2年逆向,中间混杂着汇编,全是自己感兴趣的地方,我说一下咱们对编程理解的不同,学习语言并不是你所说的研究语法规范,语法规范只用遵循就行,不用太过深入研究,就好比C++中的很多语法问题,我随便举一个例子:

        void(*fp)(); 

fp = test;

fp();

void(*fp1)();  

fp1 = test;

(*fp1)();

就好比这个问题,fp1()和(*fp1)都能调用函数,那么问题来了,*是取内容符号,fp1是地址,那么(*fp1)()是取得地址的内容然后调用,和fp1()直接通过地址直接调用,那么怎么理解是对的呢?所以我觉得语法不是要去深入研究的,你深入研究之后你会发现有些设计更难懂了。

而研究的是内存方面的知识,比如说类在内存是什么样子的形式?this指针在反汇编代码中是什么样子的,这样更有意义,对吗?再比如java中的JVM相关的知识,基础入门语法知识入门的最基本的要求,想要写出好的代码,参考文档是唯一准确的路径,java普通书籍教的永远是语法,不如看一本JVM相关的书籍更能理解java的一套机制,学习MySQL几天也是断断续续,中间有自己的项目要做,说实话我觉得MySql没有任何难度,你可能觉得我说大话,如果你边看视频边看文档,你会发现老师讲的很多语法只有很多方法中的一种,估计是课程时间的原因和只是希望学者先接触一下,老师不会把所有的情况列举出来,靠的就是自己看文档的能力,我完全可以不看视频可以直接看文档来写出mysql的代码,但是有很多不是代码部分的知识只能通过视频来获取,我不会去死背他的语法,我只会在我觉得该用到的时候去查询相关的信息,我觉得某软件可以用到相关的知识,我才会去查阅资料,写出基本能使用的功能就OK了,对于mysql来说如此,我也不是专业从事数据库方面的工作,我怼mysql的要求就是能看懂代码,能写出基本的代码就OK。你说我是小白,我不否认在mysql上面我确实是个小白,但在别的方面,我也不敢说自己是大神,我只能说我比正常的程序员研究的深入一点就行了,我说我学过十几门语言,我也只是想证明我看过看多文档,我觉得看文档来学习才能获取正确的只是,如果你搜索某些技术方面的问题,你会发现所有搜索出来的问题,包括很多博客,都是转载一个人的,某度第一页全是回答的一样,靠自己去研究看官方给的文档才是比较理想的途径。如果觉得我说的有问题,证明咱们对编程的理解不同。

1 回复 有任何疑惑可以回复我~

什么鬼,刚开始学你去看手册,你不是找虐吗?百度一下表级约束和列级约束的区别,找到的文章也是大把大把的。列级约束只作用于一个列,比如一个列设置default约束,这个default只是影响这个字段,所以可以把它写到这个列的定义中去,就是紧接着列名,逗号之前;表级约束涉及到多个列,比如一个表级外键,至少涉及到两张表的两个列吧,所以要把它拿出来,放到列定义的后面去,逗号分割,不能包括在列定义中,要用FOREIGN KEY(pid) REFERENCES t1(id)来指明。看一下我贴的这个链接,讲的很好,我也是刚知道外键也能设置成列级约束。。

http://blog.csdn.net/hanxuemin12345/article/details/7828206

0 回复 有任何疑惑可以回复我~
#1

无悔欲 提问者

我学过很多语言,看手册应该是很简单的,没有什么难度,数据库现在是回头来补习一下,其实我感觉学多了编程语言,更是学习看文档的能力。
2017-09-19 回复 有任何疑惑可以回复我~
#2

慕粉1720382552 回复 无悔欲 提问者

你确定你是“学过很多语言”?感觉能说出这种话的人,要么是大神级别的,那叫做触类旁通,真正掌握了编程精髓,要么就是小白,各个程序设计语言学个语法规范,还没往深处去钻研。入门找视频教程快速入门,往深钻研时要时时参考手册的,看你提问提的乱七八糟,毫无章法,我感觉你是后者。应该先专精后广览。
2017-09-19 回复 有任何疑惑可以回复我~
#3

无悔欲 提问者

由于字数限制后面的补上,上面我提出的第一个问题前面虽然排版很乱,但是我觉得如果你对着文档看不是什么难事。后面第二个问题你给的那个博客我看到了,我发现通过SHOW CREATE TABLE来查看,发现约束条件的条件都跑到了后面变成了表级约束,不知道我这样理解对不对。
2017-09-20 回复 有任何疑惑可以回复我~
#4

无悔欲 提问者

比如我创建一个表CREATE TABLE tt(id INT UNSIGNED NOT NULL PRIMARY KEY); 通过SHOW CREATE TABLE 查询是 mysql> SHOW CREATE TABLE tt; | Table | Create Table | tt | CREATE TABLE `tt` ( `id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
2017-09-20 回复 有任何疑惑可以回复我~
#5

无悔欲 提问者 回复 慕粉1720382552

最后我还有一个回复你的评论,因为字数原因,只能写在我自己的帖子下面的最后一个回复了
2017-09-20 回复 有任何疑惑可以回复我~
查看3条回复

举报

0/150
提交
取消
与MySQL的零距离接触
  • 参与学习       396886    人
  • 解答问题       3353    个

本课程涵盖全部MySQL数据库的基础,学习MySQL数据库的基础知识

进入课程

表级约束和列级约束

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信