文章目录
- 创建表:create table
- 示例1
- 定义表时,必须定义每个列是null列还是not null列
- 示例2
- 示例3
- 示例4:给列指定默认值;获取系统当前日期
- 小结
- 更新表:alter table语句
- 示例1:给已有表加列,删除没数据的已有列
- 删除表(简单):不是删除内容;drop table
- 重命名表
- 总结
- 用交互式工具创建表实际也是用的sql语句,只不过是工具自动生成的而已。
创建表:create table
示例1
create table NewProducts
(
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
);
如果表名写products会报错:
因为这个数据库中已经有一个表的表名是products了,这样子其实是一种保护机制,可以防止我意外覆盖已有的表,如果不报错,那我的代码就把原来的表覆盖了,那还不完犊子???下图的最后一段说了,如果真的想覆盖原表,那就先删除原表,然后再建立。
对新建的表查询:
select *
from NewProducts;
列都有了,只是没有填充数据
定义表时,必须定义每个列是null列还是not null列
示例2
没什么特殊的,都一样的例子
create table NewOrders
(
order_num integer not null,
order_date datetime not null,
cust_id char(10) not null
);
select * from NewOrders;
示例3
没什么特殊的,都一样的例子
只是这里展示了:不写null,则默认为null列,即默认支持null值
create table NewVendors
(
vend_id char(10) not null,
vend_name char(50) not null,
vend_address char(50) ,
vend_city char(50) ,
vend_state char(5) ,
vend_zip char(10) ,
vend_country char(50)
);
select * from NewVendors;
示例4:给列指定默认值;获取系统当前日期
create table NewOrderItems
(
order_num integer not null,
order_item integer not null,
prod_id char(10) not null,
quantity integer not null default 1,
item_price decimal(8, 2) not null
);
select * from NewOrderItems;
select current_date();
小结
- 创建表时必须给出所有列的名字,以及数据类型,以及是否支持null值。
- null列不可以作为主键!因为null列的某一行的值可以没有,那还怎么唯一标识这一行呢。只有not null列才可以作为主键。
- 不是所有的DBMS都默认为null列,还是要看实现。
- 原来开发人员更喜欢用的是默认值,而不是null列,即大家还是希望有值,哪怕只是默认值,也比没值好。
更新表:alter table语句
这一小节的探讨主题是更改表的结构,比如增加列,删除列。但是一般最好不要后期更改,而是一开始就设计好。
- 更改表结构是一件不是很希望出现的事情,即最好是在表的设计之初就考虑全面充分一点,而不要到后面再去大幅更改表的结构。
如果非要改,那就要遵循下面几点: - 大家(指多数DBMS)都支持给表增加列,但是不不太允许你更改已有的列,包括删除已有列,已有列的数据的更改当然也是限制很严格。这么做都是为了安全,毕竟数据一删一改,都是没有后悔药的,真要出差错了又容易出大事。
- 对已有列重命名大家都支持,因为根本不是什么见血的涉及根骨的事儿,是比较皮毛的事儿。DBMS只需要把已有代码中原列名全改为新列名就没问题了。
-如果是比较复杂的更改操作,则不要在原表上直接进行,而是建立一个新表,把原表复制过去,即做一个完整备份后,再对原表进行修改。这非常非常重要,因为alter table的使用要极为小心,甚至有可能出现无法删除新添加的不需要的列,即你添加以后才发现其实不需要,想删除也删除不了了。
示例1:给已有表加列,删除没数据的已有列
alter table Vendors
add vend_phone char(20) null;
加了一个电话列,数据类型是20个char字符,允许没有值
再删掉这个列(还没给这列加任何数据,所以不会造成数据的安全问题,允许删除)
alter table Vendors
drop column vend_phone;
删除表(简单):不是删除内容;drop table
drop table CustCopy;
我想试试对有数据的表使用drop table, mysql会不会有防止意外删除的功能:
CREATE table CustCopy as
select * from Customers;
drop table CustCopy;
并没有任何提示和阻止
于是我又试了试删除原表Customers,哈哈,有提示和阻止了:
CREATE table CustCopy as
select * from Customers;
drop table Customers;
看来我复制的CustCopy表无法复制到Customers表和其他表的关联信息,所以删除CustCopy时,DBMS根本不care ,你爱删除就删除吧,反正他和别的表没联系不会影响其他表。
而要删除原表Customers就不行了,DBMS马上站出来阻止,因为这个表和别的表有关联,一旦删除会出事。
还是很安全的。
重命名表
又是一个百花齐放各搞各的的点
总结
- SQL必知必会的课上完后,只是入门sql, 以后所有的新知识就需要自己查阅相关DBMS的官方文档自学了。有很多东西,不同DBMS给出的实现都不一样,这也需要自己看文档。
总之就是要备份,要小心
关键字
- default
- alter table
- add
- drop