注:关键字:是指在SQL中有意义的字,某些关键字(例如SELECT, DELETE, 或 BIGINT)是保留的,需要特殊处理才能用作表和列名称等标识符。这一点对于内置函数的名称也适用。
CREATE {DATABASE | SCHAMA} [IF NOT EXISTS] db_name [DEFAULF] CHARACTER SET [=] charset_name;
其中:[DEFAULF] CHARACTER SET [=] charset_name;,代表设置数据库的编码方式,不写默认是数据库的编码方式。
SHOW {DATABASES | SCHAMAS} [LIKE 'pattern' | WHERE expr]
ALTER {DATABASE | SCHAMA} [db_name] [DEFAULT] CHARACTER SET [=] charset_name
DROP {DATABASE | SCHAMA} [IF EXISTS] db_name
注:查看警告信息:SHOW WARNINGS;
注:以TINYINT为例,讨论取值范围:
1)对于无符号数:1111 1111 ~ 0000 0000 即 255 ~ 0
2)对于有符号数:最大值是0111 1111 即 +127,最小值为什么是-128呢?因为在计算机中,表示负值是用补码,虽然 -0 也是 0,这样就出现两个补码代表一个数值的情况,为例将补码与数字一一对应,所以认为规定 0 一律用 +0 代表,同时为了充分利用资源,九江原来本应该表示 -0 的补码规定为代表 -128.
注:M >= D
注:CHAR(M)是定长类型,如果不足长度则通过空格来补全;VARCHAR(M)是变长类型;
ENUM枚举值,即给定几个选项,从选项中做选择,最多有65535个选择;
SET代表在集合中选择任意的排列组合都是可以的;
注:显示当前打开的数据库:SELECT DATABASE();
CREATE TABLE [IF NOT EXISTS] table_name (
column_name data_type ,
......
)
eg:创建数据表
mysql> CREATE TABLE tb1(
username VARCHAR(20),
age TINYINT UNSGINED,
salary FLOAT(8,2) UNSIGNED
);
注:如果省略列名(字段值),那么就需要对每一个字段逐一赋值,否则会报错。如果不省略就可以为某些字段赋值。
eg:
MySQL配置文件my.ini:default-storage-engine = INNODB,然后重启MySQL相关服务
1.登录MySQL客户端
mysql -uroot -ppassword
2.打开一个数据库
USE test;
3.创建两张数据表
CREATE TABLE provices(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL
);
创建完成如果不确定可以通过SHOW CREATE TABLE Provices来查看创建命令
CREATE TABLE user(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
pid BIGINT,
FOREIGN KEY (pid) REFERENCES provices (id)
);
此时会报错:无法创建user表,原因是违反了条件3,pid的数据类型和父表中的id的数据类型不同导致的。
于是对其进行修改,而且对于整型也一定要保证有无符号的统一,重新创建user表:
CREATE TABLE user(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provices (id)
);
注:目前的父表是provices,子表是user,子表user中有外键,其参照的表叫做父表。
外键列是pid,参照列是id。在参照列中并未创建索引,如果没有创建,会自动创建索引,这里由于id是主键,在创建时MySQL自动为其创建了索引,所以参照列已经存在索引。检验:显示索引:SHOW IINDEXS FROM provices[\G是以网格形式呈现]
再查看子表是否存在索引:
发现存在两个索引,分别是id主键和pid外键也被创建了索引。
eg:而且需要注意,父表要在子表前插入记录,否则子表的记录无法参照
1.为了演示CASCADE,首先创建一张新的用户表users1:
CREATE TABLE users1(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provices (id) ON DELETE CASCADE
);
2.查看users1表的创建命令:SHOW CREATE TABLE users1
注:其中ON DELETE CASCADE表示的是在父表中删除相应的行,同时也删除,更新子表中相应的行。
如果插入到子表中的记录中的外键列对应的约束列还不存在,那么就会插入(eg第二条记录插入失败)失败,并且下一条记录插入时,如果是AUTO_INCREMENT的话就会从第三条记录插入。
在外键约束中,在实际开发中,很少使用物理的外键约束,一般使用逻辑外键约束,因为物理的外键约束,只有InnoDB引擎才支持,所以一般不会去实际定义物理的外键。逻辑约束的意思是,两张表按照某种联系去创建,但是不使用FOREIGN KEY这个关键词来定义。
ALTER TABLE tb1_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]
发现默认是在之后添加
ALTER TABLE tb1_name ADD [COLUMN] (col_name column_definition , ...)
注:添加多列时,不能指定位置关系,只能在规定的位置下方添加
ALTER TABLE tb1_name DROP [COLUMN] col1_name , DROP [COLUMN] col2_name , ADD [COLUMN] col3_name col_definition
ALTER TABLE tb_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name , ...)
ALTER TABLE tb_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY] [index_name] [index_type] (index_col_name,...)
ALTER TABLE tb_name ADD [CONSTRAINT[symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition
eg:
ALTER TABLE users ADD FOREIGN KEY (pid) REFERENCES provices (id);
ALTER TABLE tb_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
ALTER TABLE tb_name DROP PRIMARY KEY
ALTER TABLE tb_name DROP {INDEX | KEY} index_name
ALTER TABLE tb_name DROP FOREIGN KEY fk_symbol
注:查看外键约束的名称,通过:SHOW CREATE TABLE users; 找到[约束]CONSTRAINT 'fk_symbol'
ALTER TABLE tb_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
注:由大类型转换到小类型时要注意数据的丢失
ALTER TABLE tb_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]