WITH CHECK 选项
WITH CHECK OPTION 是 CREATE VIEW 语句选项。WITH CHECK OPTION 的目的是确保所有 UPDATE 和 INSERT 都满足视图定义中的条件。
如果它们不满足条件,则 UPDATE 或 INSERT 返回错误。
以下代码块具有使用 WITH CHECK OPTION 创建相同视图 CUSTOMERS_VIEW 的示例。
CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM CUSTOMERS
WHERE age IS NOT NULL
WITH CHECK OPTION;
这种情况下的 WITH CHECK OPTION 应该拒绝在视图的 AGE 列中输入任何 NULL 值,因为视图是由 AGE 列中没有 NULL 值的数据定义的。
更新视图
可以在以下给出的某些条件下更新视图 -
-
SELECT 子句可能不包含关键字 DISTINCT。
-
SELECT 子句可能不包含汇总函数。
-
SELECT 子句可能不包含集合函数。
-
SELECT 子句可能不包含集合运算符。
-
SELECT 子句可能不包含 ORDER BY 子句。
-
FROM 子句不能包含多个表。
-
WHERE 子句不能包含子查询。
-
查询可能不包含 GROUP BY 或 HAVING。
-
计算的列可能不会更新。
-
基表中的所有 NOT NULL 列都必须包含在视图中,INSERT 查询才能正常工作。
因此,如果视图满足上述所有规则,那么您可以更新该视图。以下代码块有一个更新 Ramesh 年龄的示例。
SQL > UPDATE CUSTOMERS_VIEW
SET AGE = 35
WHERE name = 'Ramesh';
这最终会更新基表 CUSTOMERS,同样会反映在视图本身中。现在,尝试查询基表,SELECT 语句将产生以下结果。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
在视图中插入行
数据行可以插入到视图中。适用于 UPDATE 命令的相同规则也适用于 INSERT 命令。
在这里,我们不能在 CUSTOMERS_VIEW 中插入行,因为我们没有在此视图中包含所有 NOT NULL 列,否则您可以在视图中插入行,就像在表中插入它们一样。
将行删除到视图中
可以从视图中删除数据行。适用于 UPDATE 和 INSERT 命令的相同规则适用于 DELETE 命令。
以下是删除 AGE = 22 的记录的示例。
SQL > DELETE FROM CUSTOMERS_VIEW
WHERE age = 22;
这最终会从基表 CUSTOMERS 中删除一行,同样会反映在视图本身中。现在,尝试查询基表,SELECT 语句将产生以下结果。
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
删除视图
显然,在您有视图的地方,如果不再需要视图,您需要一种方法来删除它。语法非常简单,如下所示 -
以下是从 CUSTOMERS 表中删除 CUSTOMERS_VIEW 的示例。
DROP VIEW CUSTOMERS_VIEW;