前引:本篇知识小结是本人总结《MySQL必知必会》一书的笔记,如有内容不符的内容,烦请联系。内容较少的章节合并到了相邻章节。扩充内容补充到了相似章节。
第一章 了解SQL:概念篇
数据库:是一个以某种有组织的方式存储的数据的集合。(通常理解为保存有组织的数据的容器)
数据库软件应该称为DBMS(数据库管理系统),数据库是通过DBMS创建和操作的容器。
表:是一种结构化的文件,可以用来存储某种特定类型的数据。
SQL指结构化查询语言,是一种专门用来与数据库通信的语言。
SQL使我们有能力访问数据库
SQL是一种ANSI的标准计算机语言
RDBMS:指的是关系型数据库管理系统,是SQL的基础,同样是所有现代数据库的基础,比如:SQL server,DB2,Oracle,MySQL等
RDBMS中的数据存储在被称为表的数据库对象中,表是相关数据项的集合,它由列和行组成。
现代的SQL服务器构建在rdbms之上
DBMS数据库管理系统:是一种可以访问数据库中数据的计算机程序,使我们有能力在数据库中提取,修改或者存储信息,不同的dbms提供不同的函数供查询,提交以及修改数据。
关系型数据库管理系统也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。
可以把SQL分为两个部分:数据操作语言DML 和数据定义语言DDL
DML:select update delete insert into
DDL:create alter database/table drop table create index drop index
第二章 什么是MySQL:
数据的所有存储,检索,管理和处理实际上是由数据库软件DBMS完成的。
DBMS可分为两类:一类是基于共享文件系统的DBMS,另一类为基于客户机-服务器的DBMS。(MySQL,Oracle,SQLserver等),这里客户机可以理解为:安装有sql yog的计算机(本人选的是这个),服务器是指在电脑上安装的有MySQL管理系统的计算机(自己测试通常是在一台电脑上)。
命令行登录:mysql -hlocalhost -u root -p 之后键入密码。(注意已经配置过环境变量了,否则需要找到安装路径bin目录下执行该命令)
第三章 使用MySQL
use 数据库名
show databases;
show tables;
show columns from 表名;等同于:describe customers
show create customers
show create database newdb 显示创建语句。show create table 表名;
第四章 检索数据
select *
from products;一般来说除非确实需要每个列,否则最好别使用通配符 *
select distnct id
from table;
distinct 关键字应用于所有列而不是他的前置列,Distinct 后面可以跟多个字段滤重,跟单个一样也是保证唯一性。
limit 检索的时候是从第0行开始的,不是第一行。
count(),count*和1的区别:没有区别,count(列名)和count1有些区别,有主键,count(主键)快,没有主键count1快。Count(列名)会去除空值,要注意
第五章 排序检索数据--order by
通常排序的列是显示所选择的列,但是并不一定是这样,用非检索的列排序数据也是合法的。
默认是升序排列 ASC ,降序 DESC 需要指定。升序降序结合使用的时候是不一样的,要注意。
第六章 过滤数据--where
= <> != < <= > >= between 常用操作符,MySQL的between是包含两端的,有的不包括,请注意。
空值 is not null is null
And :第一个和第二个条件都成立
Or:第一个和第二个只要成立一个条件即可成立
and 用来指示检索所有给定的条件。
or 任意条件满足即可成立。注意:and的优先级要比or高,当组合使用的时候记得加上括号。
where (id=12 or id=13)and salary=20
in 在某个范围之内,与or差不多,
两者的差别:
当使用多个候选清单的时候 in 更直观,
in的操作符更少,计算次序更容易管理
in最大的优点是可以包含子查询
第八章 通配符过滤数据-- like _
like 匹配多个,_ 下划线匹配一个,最好不要把like放在开头位置
第九章 正则表达式
正则表达式的作用是匹配文本,将一个正则表达式与一个文本串进行比较。
where name regexp '100'
where name regexp '.100' .表示匹配任意一个字符。
请注意:like '100' 和 regexp '100'
like 表示匹配整个列,如果被匹配的文本在列值中出现则like不会返回它。
后者会在列值中进行匹配。
默认不区分大小写 如果要区分 where name regexp binary '100'
or 匹配:| regexp '100|200'
[]匹配:regexp '[123] ton' 123任意一个都可以。等同于[1|2|3],[^123]匹配除了123之外的字符
where name regexp '[1-5] ton' 范围性匹配。
注意当匹配特殊字符的时候需\\ 为前导。where ’\\.‘
转义字符多数使用 单个\ ,MySQL本身使用两个\\
第十章 计算字段--
concat(name,'hh',salary)
trim rtrim ltrim 去掉左右两边的空格。
第十一章 使用数据处理函数--
length() 返回长度
lower() 小写
upper()大写
sunstring()截取
切记日期要为 yyyy-MM-dd 格式的
第十二章 汇总数据聚合函数
AVG()
count():count(*)对表中的数据计数,不管是不是包含空值,count(列名)计数会忽略空值。
max()
min()
sum():会忽略列值为 null 的行。
group by having where 和 having 的 区别:where 在数据分组前过滤,having 在数据分组后过滤。
order by
第十五章 表连接--
笛卡尔积:表连接没有关联条件时候会产生。
常用 inner join left join right join
组合查询:union 使用场景
在单个查询中从不同的表中返回类似结构的组合查询
对单个表执行多个查询,按单个查询返回数据。
union 会自动去除重复行 ,union all 不会
第十八章 全文本搜索-
innodb不支持全文本搜索,myisam支持。
数据插入:
insert into table
values('11','aa','2000'),('12','ab','3000')
insert into table (id,name,salary)
values('11','aa','2000'),('12','ab','3000')
插入的时候如果带有列名 可不按顺序也不影响,表结构改变也不影响。最好不要使用不带列名的插入。
insert into newtable (cust_id,cust_name,cust_aa)
select cust_id,cust_name,cust_aa from table;
列名不一定要一样,因为插入只是负责把新数据插入到指定的列,跟别的没有关系。
更新数据:update
update table
set id=99
where name='aa'
更新多个列:
update table
set id=99,
salary='50'
where name='aa';
ignore 关键字,当要更新多行的时候,如果其中的一行或者多行出现一个错误,则整个更新被取消,包括之前更新过的值。 发生错误也要更新可使用 update ignore table 。
如果想删除整列数据 可以把该列置为空 null
删除一行 :delete from table where id='20' delete删除表中数据而不删除表本身。
如果要删除所有行 可使用 truncate table ,他的速度更快。(它实际上是删除原来的表并重新创建一个新表,而不是逐行删除表中数据。)
Delete from table where 列名称=值
DELETE FROM orders WHERE company='nw'
删除所有行:delete from table 保留表结构
Truncate table 表名
Drop table 表名
区别:
truncate 是整体删除(速度快),delete是逐条删除(数度慢)
truncate 删除不记录MySQL日志,不可恢复数据,delete记录服务器日志,这也是truncate比delete效率高的原因。
Truncate不激活trigger触发器,但是会重置identity(标识列,自增字段)相当于自增列会被置为初始值,
Delete identity 还是会累加。
第二十一章 创建和操纵表-
create table if not exists customers
create table customers
(
cust_id int not null auto_increment,
cust_name char(50) not null,
cust_address char(50) null,
primary key (cust_id)
)ENGINE=InnoDB;
不要把null与空串混淆,null是没有值,他不是空串,,如果指定‘ ’,(两个单引号,其间没有字符),这在not null中是允许的,,空串是一个有效的值,他不是无值。
创建由多个列组成的主键:create table 表名
order_num int not null,
item_price decimal(8,2) not null,
primary key(order_num,order_item)
)ENGINE=InnoDB;
AUTO_INCREMENT:代表自动增量,每插入一行会自动增加。
每个表只允许一个AUTO_INCREMENT,而且它必须被索引,
如果在插入值的时候指定这个值,那么后续的增量将从这个值开始。后面你可能不知道最后这个值是谁,可用 select last_insert_id() 查询最后一个 AUTO_INCREMENT值。
指定默认值:prod_id int not null default 1
mysql有多种引擎,这些引擎都隐藏在MySQL服务器内,不同的存储引擎具有各自不同的功能和特性,为不同的任务选择正确的引擎能获得良好的功能和灵活性。
innodb 是一个可靠的事物处理引擎,它不支持全文本搜索。
memory在功能上等同于myisam,但是由于数据是存储在内存而不是磁盘中,速度很快(特别适合临时表);
mysiam是一个性能及高的引擎,它支持全文本搜索,但不支持事物处理。
所支持的引擎的完整列表以及不同请参阅:http://dev.mysql.com/doc/refman/5.0/en/storage_engines.html
引擎类型可以混用,但是有一个大缺陷,外键不能跨引擎,即使用一个引擎的表不能引用具有使用不同引擎的表的外键。
更新表:
alter table 表名 add 列名 char(20);
alter table 表名 drop column 列名;
添加外键:
alter table 表名
add constraint 外键名
foreign key (order_num) references orders (order_num);
重命名表:rename table customer to newtables
多个表重新命名:中间用逗号隔开即可。
第二十二章 使用视图-
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
视图重用sql语句。
简化复杂的SQL操作。
使用表的部分数据而不是整个表。
保护数据,可以给用户授予表的特定部分的访问权限,而不是整个表的访问权限。
更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。视图本身不包含数据。
视图的规则和限制:
与表名一样,视图必须唯一命名。
创建的视图数目没有限制
视图可以嵌套
视图不能索引,也不能有关联的触发器或默认值。
查询时视图可以和表一起使用。
create view
show create view viewname
更新视图:先删除 drop view viewname,再创建,或者 直接用 create or replace view
视图可以更新基本的表,但是基本上不建议这样使用。
第二十三章 使用存储引擎-
存储过程:简单来说就是为以后的使用而保存的一条或者多条MySQL语句的集合。
使用的理由:
通过把处理封装在容易使用的单元中,简化了复杂的操作。
由于不要求反复建立一系列处理步骤,保证了数据的完整性。
简化对变动的管理,如果表名,列名或者业务逻辑有变化,只需要更改存储过程的代码,使用他们的人员甚至不需要知道这些变化。
提高性能,存储过程要比使用单独的SQL语句要快。
但是存储过程的编写要比基本的sql语句复杂。
执行存储过程:
call 存储过程名(@pricelow,
@pricehigh,
@priceaverage);
存储过程可以显示结果也可以不显示。
create procedure 存储过程名()
begin
select avg(prod_price) as 别名
from table;
end;
可以变更分隔符:delimiter //
create procedure 存储过程名()
begin
select avg(prod_price) as 别名
from table;
end//
delimiter ;
使用存储过程:call 存储过程名();
实际上存储过程是一种函数。
删除:drop procedure 存储过程名 不加括号
如果在删除的过程中不存在会报错,可用 drop procedure if exists
变量:内存中一个特定的位置,用来临时存储数据。
create procedure 名(
out p1 declmal(8,2),
out p2 decimal(8,2)
)
begin
select min(prod-price)
into p1
from products;
select max(prod-price)
into p2
from products;
end;
执行:call 名(@pricelow,
@pricehigh);
所有MySQL变量都必须以@开始。
select @pricelow;
--
create procedure 名(
in onumber int,
out ototal decimal(8,2)
)
begin
select sum(iten*quantity)
from tabel
where order_num=onumber
into ototal;
end;
调用:call ordertotal(2005,@total);
select @total
显示存储过程名:show create procedure 名;
show procedure status ;显示所有的存储过程列表。
可加过滤条件:show procedure status like '名'
游标:有时,需要在检索出来的行中前进或者后退一行或者多行,这就是使用游标的原因。游标是一个存储在MySQL服务器上的数据库查询,他不是一条select语句,而是被该语句检索出来的结果集。MySQL游标只能用于存储过程和函数。
创建游标:create procedure 名()
begin
declare 游标名 cursor
for
select order_num from orders;
end;存储过程完成后游标就消失了,因为他局限于存储过程。
打开:open 游标名
close 游标名;
触发器:是MySQL响应一下任意语句而执行的一条MySQL语句。delete insert update,其他不支持。
创建触发器:唯一的触发器名
触发器关联的表
触发器应该响应的活动(delete,insert,update)
触发器核实执行(处理之前或者之后)
create trigger 触发器名 after insert on 表名
for each row select 'aaaaa'
只有表才支持触发器,视图临时表不支持。
触发器按每个事件每次定义,每个表每个事件每次只允许一个触发器,每个表最多支持6个,之前和之后。单一触发器不能和多个事件或者多个表关联。
drop trigger 触发器名。触发器不能更新或覆盖,为了修改一个触发器,必须先删除然后再创建。
第二十六章 管理事物处理
事务处理:并非所有的引擎都支持事物处理,它用来维护数据库的完整性,它保证成批的sql操作要么完全执行,要么完全不执行。
事务:指一组SQL语句。
回退:指撤销指定SQL语句的过程
提交:指将未存储的SQL语句结果写入数据库表
保留点:指事务处理中设置的临时占位符,你可以对它发布回退。(与回退整个事务处理不同)。
管理事务处理的关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。
start transaction
rollback;
commit;
事务处理块中,提交不会隐含的进行,未进行明确的提交,使用commit语句。
start transaction;
delete from 表 where order_num=20010;
delete from 表2 where order_num=20010;
commit;
隐含事务关闭 当commit 或者 rollback语句执行后,事务会自动关闭。
使用保留点:复杂的事务会使用,复杂的事务处理可能需要部分提交或回退。
创建占位符:savepoint deletel;
每个保留点都取标识它的唯一名字,以便在回退时,MySQL知道回退到何处,
rollback to delete1;
保留点越多越好,更加的灵活。保留点在事务处理完成后自动释放,也可以用 release savepoint 明确的释放保留点。
修改是否自动提交:set autocommit=0; 他是针对每个连接的而不是服务器。
第二十七章 全球化和本地化
字符集:为字母和符号的集合。
编码:为某个字符集成员的内部表示。
校对:为规定字符如何比较的指令。
使用何种字符集和校对的决定在服务器,数据库和表级进行。
show character set ; 查看所有可用的字符集。和默认的校对。
show collation;显示所有的校对,以及他们适用的字符集。
create table table
(
lie int,
lie varchar(20)
)default character set hebrew
collate hebrew_general_ci;
第二十八章 安全管理-
USE mysql;
SELECT USER FROM USER;
CREATE USER ben IDENTIFIED BY 'root'
RENAME USER ben TO benben;
set password for ben=password('new')
set password =password('new') 不指定用户名时更新当前用户的口令。
DROP USER benben;
SHOW GRANTS FOR ben;
GRANT SELECT ON newdb.* TO ben;
SHOW GRANTS FOR ben;
REVOKE SELECT ON newdb.* TO ben;
新建连接 :IP 可以用本机local host 或者通过ipconfig 查看即可。
grant 和 revoke可在几个层次上控制访问权限:
整个服务器,使用grant all 和 revoke all;
整个数据库:使用 on databases.*
特定的表:on database.table
特定的列
特定的存储过程
grant select ,insert on 库名.* to 用户名;
第二十九章 数据库维护-
首先刷新未写入数据 flush tables
ANALYZE TABLE orders 检查表键是否正常
CHECK TABLE orders,orderitems;--检查
mysql -u root -p
show global variables like "%datadir%"; 查看安装目录
链接补充:MySQL :: MySQL Documentation
以下内容是一些基础的补充:仅供参考
可以把SQL分为两个部分:数据操作语言DML 和数据定义语言DDL
DML:select update delete insert into
DDL:create alter database/table drop table create index drop index
Distinct 后面可以跟多个字段滤重,跟单个一样也是保证唯一性。
第三十章 约束-
约束:用于限制表的数据的类型,在创建表的时候添加,或者建表之后添加。
Not null,nuique,primary key,foreign key,check,default
Not null约束:不能为空值
Create table ss
(
Id int ,
Nam varchar(255) not null
)
Unique约束:唯一标识数据库表中的每条记录
Unique和主键约束均为列或列集合提供了唯一性的保证,主键拥有自动定义的unique约束。每个表可以有多个unique约束,但是每个表只能有一个主键约束。
Create table sd
(
Id int not null,
Lastname varchar(20)
Unique (int)
)
如果需要命名unique约束,以及定义多个unique约束:有重复值的时候无法给该字段添加唯一约束
Create table zs1
(
Id int,
Af varchar(23) not null,
Adddd varchar(25)
Constraint 约束名 unique (id,af)
)
表创建完成的时候添加约束:(多个)
Alter table zs1 add unique(id)
Alter table zs1 add constraint 约束名 unique (id,af)
撤销约束:
Alter table zs1 drop index 约束名
Alter table zs1 drop constraint 约束名
单个约束撤销的时候直接加上约束的字段即可。
Primary key 约束:标识唯一记录,不包含空值,和unique的区别是 主键不能为空值,nuique可以。
Create table zs1 mysql
(
Id int,
Nnn varchar(25)
Primary key (id)
)
Create table zs1
(
Id int,
Nn varchar(25) primary key
)
主键包含多个字段:
Create table zs1
(
Id int,
Nn varchar(25)
Ab int
Constraint 约束名 primary key (id,nn)
)
建表之后创建:
Alter table zs1 add primary key (id)
Alter table zs1 add constraint 约束名 primary key (d,nn)
如果在建表之后添加主键,必须把主键列声明为不包含null(在表首次创建的时候)
撤销主键约束:
Alter table zs1 drop primary key --mysql
Alter table zs1 drop constraint 约束名 –oracle
Foreign key:一个表中的字段是主键,在另一个表中是外键,外键约束用于预防破坏表之间连接的动作。也能防止非法数据插入外键列,因为它必须指向那个表中的值之一。
Create table zs2 --mysql
(
Id int ,
Orid int,
Idp int,
Primary key (id),
Foreign key (idp) referenecs zs1(id)
)
Create table zs3 – oracle
(
Id int primary key,
Idd int ,
Ida int froeign key references zs1(id)
)
外键包含多个:
Create table zs4
(
Id int ,
Idd int ,
Qq int,
Primary key (id),
Constraint 约束名 foreign key (idd)
References zzs1(id)
)
Alter table zs1 add froeign key(id) references zs2(idp)
Alter table zs1 add constraint 约束名 foreign key (id) references zs2(idp)
撤销外键:
Alter table zs1 drop foreign key 约束名
Alter table zs1 drop constraint 约束名
Check约束:用于限制列中的值的范围,如果对单个列定义check约束,那么该列只允许特定的值,对一个表定义check约束,那么此约束会在特定的列中对值进行限制。
Create table zs1 --mysql
(
Id int,
Na varchar(25),
Check (id>0)
)
Create table zs1 --oracle
(
Id int check (id>0),
Na varchar(25),
)
多个check约束:
Create table zs1
(
Id int,
Nn int,
City int,
Constraint 约束名 check (id>0 and city=’assa’)
)
撤销约束:
Alter table zs1 drop constraint 约束名
Alter table zs1 drop check 约束名
Default约束:
Create table zs1
(
Id int,
Nn int,
Nam varchar(25) default ‘asasa’
)
Alter table zs1 --mysql
Alter city set default ‘aaa’
Alter table zs1 --oracle
Alter column city set default ‘saaa’
撤销default约束:
Alter table zs1 -- mysql
Alter city drop default
Alter table zs1 --oracle
Alter column city drop default
第三十一章 索引
index---索引是对数据库表中一列或者多列的值进行排序的结构。缩短查询的时间。 主键,唯一,联合索引。
创建索引,在不读取整个表的情况下,索引使数据库应用程序可以更快的查找数据。
索引会加速查询,但是更新数据慢。理想的做法是在常常被搜索的列(以及表)上面创建索引。
Create table zs1 --建表时侯
(
Id int,
Name int,
Asas int
Index(id)
);
Create index 索引名
On zs1 (id)
Create index 索引名
On zs1 (id desc)
索引不止一个:
Create index 索引名
On zs1 (id ,nn)
删除索引:不同的数据库可能不一样
Drop index 索引名 on zs1
Drop index zs1.id --sqlserver
Drop index id –oracle
Alter table zs1 drop index 索引名
--删除表--
Drop table zs1 表的一切都会删除
Drop database 数据库名
Truncate table zs1 仅仅删除表中的数据,保留结构之类的
--修改表—
添加列
Alter table zs1 add 列名 数据类型
删除列:alter table zs1 drop column 列名 –注意某些数据库不支持这种写法
改变列的数据类型:alter table zs1 alter column 列名 数据类型 --MySQL要用modify
--auto-increment会在新纪录插入表中时生成一个唯一的数字
我们通常希望在每次插入新纪录时,自动的创建主键字段的值,我们可以在表中创建一个auto-increment字段,
Create table zs1 主键自增 –MySQL语法
(
Id int not null auto_increment,
Nn varchar(25),
Add varchar(25)
Primary key (id)
)
Alter table zs1 auto_increment =100 更改起始值
当插入数据的时候手动更改自增的值,后面再次插入以上一条数据的序列值为准累加。
SQL server 语法:
Create table zs1
(
Id int primary key identity,
Lastname int
)
Access的语法:
Create table zs1
(
Id int primary key autoincrement,
Laname varchar(255)
)
要规定 "P_Id" 列以 20 起始且递增 10,请把 autoincrement 改为 AUTOINCREMENT(20,10)
Oracle语法:
Create sequence sqq
Minvalue 1
Start 1
Increment by 1
Cache 10
Insert into table zs1 (id,name,sex) values (sqq.nextval,’aa’,’man’) 这个相对复杂一下,需要注意
--date函数---
--date 函数—
MySQL日期类型:
Date 格式:YYYY-MM-DD
Datetime 格式:YYYY-MM-DD HH:MM:SS
Timestamp 格式:YYYY-MM-DD HH:MM:SS
Year 格式:YYYY或者YY
Sql server日期格式:
----null 值---
Null 值是遗漏的未知数据,默认的,表可以存放null值,null值用作未知的或不适用的值的占位符。无法比较null和0;他们是不等价的。
无法用运算符来比较测试空值,必须使用 is null 和 is not null
关于 null 的函数:
Isnull(),nvl(),ifnull(),coalesce()
Isnull(列,0) nvl(列,0) ifnull(列,0) coalesce(列,0)
--数据类型---
Char(size):保存固定长度的字符串(可包含字母,数字以及特殊字符),在括号中指定字符串的长度,最多255个字符。
Varchar(size):保存可变长度---------指定字符串的最大长度,最多255个字符。
Tinytext:存放最大长度为255个字符的字符串
Text: 存放最大长度为65535个字符的字符串
Int(size)
Tinyint:-128-127
Float(size,d):带有浮动小数点的小数字,括号中规定最大位数,d规定小数点最大位数。
Decimal(size,d):作为字符串存储的double类型,允许固定的小数点。
Date() 不带时间
Datetime():带有时间
Timestamp:时间戳 带有时间,
Time:时间
Year:年
---本书实例建表语句如下:
########################################
# MySQL Crash Course
# http://www.forta.com/books/0672327120/
# Example table creation scripts
########################################
########################
# Create customers table
########################
CREATE TABLE customers
(
cust_id INT NOT NULL AUTO_INCREMENT,
cust_name CHAR(50) NOT NULL ,
cust_address CHAR(50) NULL ,
cust_city CHAR(50) NULL ,
cust_state CHAR(5) NULL ,
cust_zip CHAR(10) NULL ,
cust_country CHAR(50) NULL ,
cust_contact CHAR(50) NULL ,
cust_email CHAR(255) NULL ,
PRIMARY KEY (cust_id)
) ENGINE=INNODB;
#########################
# Create orderitems table
#########################
CREATE TABLE orderitems
(
order_num INT NOT NULL ,
order_item INT NOT NULL ,
prod_id CHAR(10) NOT NULL ,
quantity INT NOT NULL ,
item_price DECIMAL(8,2) NOT NULL ,
PRIMARY KEY (order_num, order_item)
) ENGINE=INNODB;
#####################
# Create orders table
#####################
CREATE TABLE orders
(
order_num INT NOT NULL AUTO_INCREMENT,
order_date DATETIME NOT NULL ,
cust_id INT NOT NULL ,
PRIMARY KEY (order_num)
) ENGINE=INNODB;
#######################
# Create products table
#######################
CREATE TABLE products
(
prod_id CHAR(10) NOT NULL,
vend_id INT NOT NULL ,
prod_name CHAR(255) NOT NULL ,
prod_price DECIMAL(8,2) NOT NULL ,
prod_desc TEXT NULL ,
PRIMARY KEY(prod_id)
) ENGINE=INNODB;
######################
# Create vendors table
######################
CREATE TABLE vendors
(
vend_id INT NOT NULL AUTO_INCREMENT,
vend_name CHAR(50) NOT NULL ,
vend_address CHAR(50) NULL ,
vend_city CHAR(50) NULL ,
vend_state CHAR(5) NULL ,
vend_zip CHAR(10) NULL ,
vend_country CHAR(50) NULL ,
PRIMARY KEY (vend_id)
) ENGINE=INNODB;
###########################
# Create productnotes table
###########################
CREATE TABLE productnotes
(
note_id INT NOT NULL AUTO_INCREMENT,
prod_id CHAR(10) NOT NULL,
note_date DATETIME NOT NULL,
note_text TEXT NULL ,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
) ENGINE=MYISAM;
#####################
# Define foreign keys
#####################
ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders (order_num);
ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products (prod_id);
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers (cust_id);
ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors (vend_id);
--------完结:内容穿插可能不规范后续会优化整理