削除にあいまいさはありません。DELETE FROM aView ;
ビューにある基になるテーブルのすべての行を削除する必要があります (許可されている場合)。
CREATE TABLE Student
( sid INT NOT NULL
, name VARCHAR(20) NOT NULL
, PRIMARY KEY (sid)
) ;
INSERT INTO Student
(sid, name)
VALUES
(1, 'Alex'),
(2, 'Bill'),
(3, 'Cate'),
(4, 'Dean'),
(5, 'Eve'),
(6, 'Alex'),
(7, 'Bill'),
(8, 'Cate') ;
CREATE VIEW NonUnique AS
SELECT *
FROM Student S1
WHERE EXISTS
( SELECT *
FROM Student S2
WHERE S1.sID <> S2.sID
AND S2.name = S1.name
) ;
DELETE FROM NonUnique ;
DELETE
正しく実装されている SQL 製品では問題なく動作します。SQL-ServerおよびOracleの SQL-Fiddles を参照してください。
SELECT * FROM Student ;
結果:
sid | name
----------
4 | Dean
5 | Eve
MySQL はエラーを提供します:The target table NonUnique of the DELETE is not updatable
Postgres は以下を提供します:ERROR: cannot delete from view "nonunique":
MySQL でこれを試すと、次のようになります。
DELETE s
FROM Student AS s
JOIN
NonUnique AS n
ON n.sid = s.sid ;
またはこれ:
DELETE
FROM Student
WHERE EXISTS
( SELECT *
FROM NonUnique
WHERE NonUnique.sid = Student.sid
) ;
エラーは次のとおりです。The definition of table 'NonUnique' prevents operation DELETE on table 'Student'.
ただし、Postgres では、2 番目のステートメントが成功し、正しい行が削除されます。
MySQLは、派生テーブル内でビューを非表示にできた場合にのみ成功します。
DELETE s
FROM Student AS s
JOIN
( SELECT *
FROM NonUnique
) AS n
ON n.sid = s.sid ;