乐者为王

Do one thing, and do it well.

创建视图时的with check option选项

通过有with check option选项的视图操作基表,有以下结论:

  1. 首先视图只操作它可以查询出来的数据,对于它查询不出的数据,即使基表有,也不可以通过视图来操作;
  2. 对于update,有with check option,要保证update后,数据能被视图查询出来;
  3. 对于delete,有无with check option都一样;
  4. 对于insert,有with check option,要保证insert后,数据要被视图查询出来。

对于没有where子句的视图,使用with check option是多余的。

下面用一个例子来说明第4条:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE students (
    id int NOT NULL AUTO_INCREMENT,
    name varchar(50) NOT NULL,
    age int,
    sex char(1),
    PRIMARY KEY (id)
);

CREATE VIEW male_students_view AS
    SELECT name, age FROM students
    WHERE sex = 'M'
    WITH CHECK OPTION;
1
2
-- 报CHECK OPTION failed错误,原因如4,插入数据后要还能被视图查询出来。
INSERT INTO male_students_view VALUES('WU', 18);
1
2
-- 报Column count doesn't match value count错误,因为视图中根本没有sex列。
INSERT INTO male_students_view VALUES('WU', 18, 'M');

将students.sex列改成默认值为M:

1
ALTER TABLE students MODIFY sex char(1) NOT NULL DEFAULT 'M'
1
2
-- 执行成功,1 row affected。
INSERT INTO male_students_view VALUES('WU', 18);
1
2
-- 还是同样的问题,Column count doesn't match value count。
INSERT INTO male_students_view VALUES('WU', 18, 'M');

或者不修改students.sex的属性,将视图改成:

1
2
3
4
CREATE VIEW male_students_view AS
    SELECT name, age, sex FROM students
    WHERE sex = 'M'
    WITH CHECK OPTION;
1
2
-- 会报CHECK OPTION failed错误。
INSERT INTO male_students_view VALUES('WU', 18);
1
2
-- 执行成功,1 row affected。
INSERT INTO male_students_view VALUES('WU', 18, 'M');

以上例子都在MySQL上实际执行过。

Comments