日期:2014-05-16  浏览次数:20411 次

第四部分 约束 视图 事务 安全

一、约束

??????? CHECK(检查)约束限定允许插入某列的值。她和WHERE子句使用相同的条件表达式。如果插入的值无法通过CHECK条件,那么会出现错误信息。(MySQL中无法使用check,可以用触发机制(trigger,满足特定条件才执行)来实现)。

CREATE TABLE piggy_bank
(
    id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    coin CHAR(1) CHECK (coin IN('P','N','D','Q')),
    coin_year CHAR(4)
)
CREATE TABLE mystery
(
    column1 INT(4) CHECK (column1>200),
    column2 CHAR(1) CHECK (column2 NOT IN('x','y','z')),
    column3 VARCHAR(3) CHECK ('A'=SUBSTRING(column3,1,1)),
    column4 VARCHAR(3) CHECK ('A'=SUBSTRING(column4,1,1) AND 'A'=SUBSTRING(column4,2,1))
)
ALTER TABLE my_contacts
ADD CONSTRAINT CHECK gender IN('M','F');

?

?二、视图

CRETE VIEW  web_designers AS
SELECT mc.name,mc.phone,mc.email
FROM my_contacts mc 
NATURAL JOIN job_desired jd   #此处也可以改为INNER JOIN job_desired jd ON mc.id=jd.id
WHERE jd.title='Web Designer';
?
SELECT * FROM web_designers;
???????? ?这个视图与查询等价于?
SELECT * FROM 
CRETE VIEW  web_designers AS
SELECT mc.name,mc.phone,mc.email
FROM my_contacts mc 
NATURAL JOIN job_desired jd 
WHERE jd.title='Web Designer';  
???????? 视图是一个查询中使用VIEW是才存在的表,它被视为虚拟表。视图把查询简化成一条命令。即使一直改变数据库结构也不会破坏依赖表的应用程序。创建视图可以隐藏读者需看到的信息。
CRETE VIEW  job_raises AS
SELECT mc.name,jc.id,jc.salary,jd.salary_low,jd.salary_low-jc.salary AS raise
FROM my_contacts mc 
INNER JOIN job_desired jd 
INNER JOIN job_current jc
WHERE mc.contact_id=jd.contact_id AND jd.contact_id=jc.contact_id;
??????? 这个查询是庞大的,且经常使用时,可以将其创建为一个视图,这样就只需要输入SELECT * FROM job_raises;就可以查到需要的信息。
??????? 视图不仅仅能用于SELECT,还能用于UPDATE、INSERT、DELETE。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
CRETE VIEW  pb_dimes AS
SELECT * FROM piggy_bank 
WHERE coin='D' WITH CHECK OPTION;
??????? ?这个视图带有CHECK OPTION,这意味着,如果对视图进行update或者insert时,会检查修改或插入是否符合WHERE后面的内容,例如 UPDATE pb_dimes SET coin='X';不符合WHERE后面的字句。
??????? 一般,不使用INSERT、UPDATE、DELETE来改变视图。
??????? 用SHOW TABLES能看到表和视图,用DESC来查看结构,用DROP VIEW pd_dimes;来删除视图。
?
三、事务
???????? 在事务过程中,如果所有步骤无法不收干扰完成,则不该完成任何单一步骤。一个SQL步骤是否是事务可以用ACID来判断:一、原子性(autoumicity),不能只发生一半就停下来;二、一致性(consistency),步骤完成后应该维持数据库的一致性,例如,取钱后,余额与所取的钱的和应该与原始余额相等;三、隔离性(iolation),每次事务应该看到相同的数据库,两个人使用同一张卡同时同时取钱,一个人正在完成操作,另外一个正在查询余额,这时后一个人根本就不应该看到余额,或者后一个人看到“正在交易”之类的信息;四、持久性(burability),事务完成后,通常把数据放在主数据库以外的地方,这样就可以防止断电或者其他威胁。
??????? SQL事务工具有:START TRANSACTION持续追踪后续所有SQL语句,直到COMMIT或者ROLLBACK,而COMMIT是提交代码进行执行,ROLLBACK是撤销到START TRANSACTION状态。
??????? 要想使用事务,必须要采用正确的存储引擎。有些存储引擎不允许事务,可以用SHOW CREATE TABLE my_contacts;来查看存储引擎(反括号后面ENGINE=...),支持事务的存储引擎有BDB和InnoDB。改变存储引擎的语句是
ALTER TABLE my_contacts TYPE=InnoDB;
?
START TRANSACTION;
SELECT * FROM piggy_bank;
UPDATE piggy_bank SET coin='Q' WHERE coin='P';
SELECT * FROM piggy_bank;
ROLLBACK;    #放弃改变数据,回到原始状态
SELECT * FROM piggy_bank;
?
START TRANSACTION;
SELECT * FROM piggy_bank;
UPDATE piggy_bank SET coin='Q' WHERE coin='P';
SELECT * FROM piggy_bank;
COMMIT;    #确认改变数据
SELECT * FROM piggy_bank;
?
四、安全