本博将对主键、外键、MySql数据库约束和联结表的相关特性进行总结和实战html
表中的每一行都应该具备能够惟一标识本身的一列(或一组列),而这个承担标识做用的列称为主键数据库
若是没有主键,数据的管理会十分混乱。好比会存在多条如出一辙的记录,删除和修改特定行十分困难post
任何列均可以做为主键,只要它知足如下条件:性能
a. 任何两行都不具备相同的主键值,就是说这列的值都互不相同ui
b. 每一个行都必须具备一个主键值,主键列不容许设置为NULLurl
c. 主键列的值不建议进行修改和更新spa
最简单的表:3d
CREATE TABLE t1( id int not null, name char(20) );
带主键的表的建立:code
CREATE TABLE t1( id int not null primary key, name char(20) );
带复合主键的建立:htm
CREATE TABLE t1( id int not null, name char(20), primary key (id,name) );
主键自增:
CREATE TABLE t1( id int primary key not null auto_increment, name char(20) );
建立后再决定主键:
CREATE TABLE t1( id int not null, name char(20) ); alter table t1 add primary key (id);
外键用来保证参照完整性,MySQL数据库的MyIsAM存储引擎自己并不支持外键,对于外键的定义只是起到一个注释的做用,而InonoDB存储引擎则完整支持外键约束。
设置外键约束的两个表之间会具备父子关系,通常来讲,称被引用的表为父表,引用的表称为子表,字表中外键的字段的取值范围由父表决定,而且数据类型必须和父表中一致。
设置外键在必定程度上会下降数据库的速度。
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);
alter table products drop foreign key fk_products_verdors;
参考以前的博客:MySql数据库约束
说的直白点就是根据select语句将多个表联结在一块儿,但有一点须要注意的是联结不是物理试题,它在实际的数据库表中不存在,只存在于查询的执行当中。
首先看下建立联结的例子:
例1:select * from orders,orderitems where
orders.order_num = orderitems.order_num;
例2:select * from orders,orderitems;
从上面两个例子能明显的看到使用where和不使用where的区别,在联结两个表时,你实际上作的是将第一个表中的每一行与第二个表中的每一行进行匹配,where语句做为过滤条件,它只包含那些匹配给定条件的行,没有where语句,第一个表中的每行将与第二个表中的每行进行配对,而无论他们的逻辑上否能够在一块儿,没有联结条件的表关系返回的结果为笛卡儿积,检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
下面将用伪代码对两个示例进行区分:
示例1:
for row1 in table1: for row2 in table 2: if row1.condition == row2.condition: print(row1+row2)
示例2:
for row1 in table1: for row2 in table2: print(row1+row2)
上面展现的等值联结,其实也称为内部联结,对于这种联结可使用稍微不一样的语法来明确指明联结的类型,INNER JOIN .... ON
select * from orders INNER JOIN orderitems ON orders.order_num = orderitems.order_num;
ANSI SQL规范首选INNER JOIN ... ON语法,使用明确的联结语法确保不会忘记联结条件,有时候这样作也能影响性能。
select orders.*,orderitems.proc_id from orders INNER JOIN orderitems ON orders.order_num = orderitems.order_num;
这样能够指定列输出
许多联结将一个表中的行与另外一个表中的行相关联。可是有时候须要包含没有关联的那些行,这个时候就可使用外部连接,外部联结方式有右连接RIGHT OUTERJOIN ... ON和左联结LEFT OUTER JOIN...ON
看下面的三个示例进行比较就一目了然了
例1:内联结
SELECT customers.cust_id,orders.cust_id,orders.order_num from customers INNER JOIN orders ON customers.cust_id = orders.cust_id;
例2:左外部连接
SELECT customers.cust_id,orders.cust_id,orders.order_num from customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
输出了10002行,至关于前面伪代码中customers表为外循环,只是将custonmers中没匹配上的10002也输出了
例3:右外部连接
SELECT customers.cust_id,orders.cust_id,orders.order_num from customers RIGHT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
输出了10005行,至关于前面伪代码中orders做为外循环,将orders中没匹配上的10005进行了输出