今日清明,为留在这个冬天不再随着时光前进的各位默哀三分钟。
为了避免又是一个夜里更新的博文,这里在忧虑各种突发情况后开始动手跟今天的课程,预期两课,具体得看两篇长度以及状态。所以今天主要讲的是表的创建和操纵(操作),也就是对于表从创建到销毁的一些操作。
目录
17.1 创建表
① 表创建基础
② 使用NULL值
③ 指定默认值
17.2 更新表
17.3 删除表
17.4 重命名表
从创建讲起,也有两种,一种是使用交互式创建和管理数据库表的工具;第二种就是直接用SQL语句完成了。
用程序创建表,可以使用CREATE TABLE语句,不同DBMS支持不同语法,具体参考文档说明。
使用CREATE TABLE语句的话,需要给出:新表的名称,跟着关键字“CREATE TABLE”后;表列名字及其定义,用逗号分离;部门DBMS要求指定表的位置。
那么我们做个小练习,比如创建产品Products表(因为之前创建过products表,所以这里为了区分开,使用promult):
CREATE TABLE Product(
-> prod_id CHAR(10) NOT NULL,
-> vend_id CHAR(10) NOT NULL,
-> prod_name CHAR(254) NOT NULL,
-> prod_price DECIMAL(8,2) NOT NULL,
-> prod_desc VARCHAR(1000) NULL );
新增的表格和原有的表格,再来看一下上面的语法,各列之间用逗号分隔,后跟数据类型,用括号包裹住跟在表名后。
这里需要注明一点,建表语法不同DBMS略有差异,尤其是在数据类型约束方面,比如MySQL中varchar替换成text之类的,针对不同的DBMS,最好编写不同的表创建脚本。
(说到脚本,之前一直以为服务器那种Linux系统上编写的程序才叫做脚本,还是不够熟悉啊,数据库,一通百通!加油补网哇~领悟计算机的魅力吧~
提到两个小问题,语句格式化的和替换现有表,前者主要是指多行单行没有区别,会忽略空格,适当缩进只是便于阅读编辑,就像之前的代码都是直接用的一行,其实编写时候用的回车区别,粘过来的时候去掉了分行“->”标识,上面这条就没有删掉,注意粘贴的时候去掉前面的部分,不然可能没办法识别;后者替换现有表的问题,基于创建新表时,同表名的表不存在,不然就有问题啊,比如会覆盖已有的表,记录也会被清掉,所以SQL要求先手工删除该表再重建,而不是直接用创建覆盖这种骚操作。
学习这个部分之前,我们回顾一下NULL就是吗,没有值或缺值,那么允许NULL也就允许插入行时不给出该行的值,而那些不允许NULL值的列就不会接受没有列值的行,插入或更新时,该列不为空。这个和做人某方面惊人的相似,如果你不设底线的话,那么别人越过雷池让你不舒服了,你没有办法去指责别人也更容易受到不公平的对待,而恰恰相反的是,那些一开始就明确自己底线和原则的人,反而得到了很好妥善的对待,明确自我,加强自身建设。
接下来,我们走个例子看看,说明一下,每个表列要么是NULL列,要么是NOT NULL列,在创建时表定义给出:
书上的例子分别创建了订单Orders表、供应商Vendors表:
一个是全非空的要求,一个是混合了NULL和NOT NULL的,有同学奇怪了,分明截图是空白要求啊,对啊,不指定的话,就是默认设置,NULL就是默认设置,不指定NOT NULL就会被认为是不修改设置。
另外,比较重要的是,如果设置了非空,插入数据列仍然为空,就会失败,这个要强调。
然后补充三个问题,第一个默认设置为NULL的问题,还是不同DBMS的语法问题,大部分是这样,不能确定的话还是查下文档;第二个是主键和NULL值,它们两个条件是不能一起的,比如主键不可以为NULL,NULL列不可以为主键!再就是NULL自己的问题,要理解它不是一个空字符串啊(前面博文也有提到,空字符串是个' '),在NOT NULL列允许这样子的是有效值,并不是NULL的无值。
默认值就是不指定的话,就给你分配这个值。在创建部分,用关键字DEFAULT指定。
要走个例子,但是这个创建表吼,真的比较复杂,所以这部分的代码,我就直接截书上样例图了。
方框圈住的部门就是默认值的设置。
然后需要注意的地方是:默认值经常用于日期或时间戳列。提个MySQL的指定DEFAULT CURRENT_DATE() 指定引用系统日期的函数或变量,将系统日期用作默认日期。然后给个类似的对照,看看大家伙都是怎么做的:
这个地方对默认进行了一个补充,许多DBA倾向用DEFAULT值而不是NULL列,尤其是那些计算或数据分组的列。
讲完上面的新增,终于讲到更新,这里用的ALTER TABLE语句,所有的DBMS都支持,但是允许更新的内容差别还是蛮大的。需要考虑比较多的问题,比如:
□ 理想情况下,不要在表中包含数据时对其进行更新。在表的设计过程中充分考虑可能的需求,避免今后对表的结构做大改动。
□ 所有的DBMS都允许给现有的表增加列,不过对所增加列的数据类型(以及NULL和DEFAULT的使用)有所限制。
□ 许多DBMS不允许删除或更改表中的列。
□ 多数DBMS允许重新命名表中的列。
□ 许多DBMS限制对已经填有数据的列进行更改,对未填有数据的列几乎没有限制。
说真的,学习过程中,注意不同DBMS的特例,部分,有些,许多这些概括词,确实太难了。但是对于复习者来说,既要把握住大概的学习,又得从细枝末节中注意到这些不同,这就是大鱼不能跑,虾米别漏liao。
而是用ALTER TABLE更改表结构,还得给出一些必要信息,比如,给个表名,改人家,人家总得在吧,所以只能对已存在的表进行修改,还有就是改造之前得知道哪些地方要改,不然目标不清晰也不行。
讲了这么久,走个实例,毕竟修改表结构还是可以的:
ALTER TABLE Vendors ADD vend_phone CHAR(20);
复杂表结构修改很麻烦,一般需要手动删除过程,有这样一些步骤,先用新的列布局创建一个新表;
再使用INSERT SELECT语句(关于这条语句的详细介绍,请参阅第15课)从旧表复制数据到新表。有必要的话,可以使用转换函数和计算字段;之后再检验包含所需数据的新表;
还需要 重命名旧表(如果确定,可以删除它);加上用旧表原来的名字重命名新表;最后根据需要,重新创建触发器、存储过程、索引和外键。
使用修改操作之前,要当心!改动前做好备份!因为数据库的更改是不能撤销的,如果增加不需要的列,也许就无法删除它们。
讲删除就很简单了,使用DROP TABLE语句,永久删除。
关系规则的问题,许多DBMS允许强制实施有关规则,防止删除与其他表相关联的表,能防止意外发生。
重命名的支持不同,所以就不做严格要求了,提一下MySQL的,使用RENAME语句,基本语法就是指定旧表名和新表名。具体参阅自己文档。
于是今天的课就到这里了,说了一万遍不想熬夜不想零点以后结束学习,又拖到了现在,这是一个非常不好的习惯。
总之呢,今天学到的几个语句都非常重要!!!用起来需要谨慎,最好在备份后使用,而扩展用法在文档中应该比较详细,菜菜就不多说了。
还是那句老话!刻意练习,每日精进!冲啊~