等同于 Oracle 中的 IF NOT EXISTS?
Equivalent to IF NOT EXISTS in Oracle?
以下语句适用于 MSSQL:
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[FK_StationObjectsID]') AND parent_object_id = OBJECT_ID(N'[Attendance]'))
BEGIN
ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)
END
我在 Oracle 中尝试过:
IF NOT EXISTS (SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_STATIONOBJECTSID' AND TABLE_NAME = 'ATTENDANCE') THEN
BEGIN
ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid);
END;
但它给我一个错误 PLS-00103 "Encountered the symbol 'ALTER'..."
使用立即执行在 PLSQL 块内触发 ddl:
IF <condition> THEN
Execute immediate 'ALTER TABLE . . .';
END if;
最近不存在的是 Tom Kyte 给出的方法 here
begin
for i in (select count(*) cnt from dual
where not exists (
SELECT *
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_NAME = 'FK_STATIONOBJECTSID'
AND TABLE_NAME = 'ATTENDANCE'
)) loop
if (i.cnt = 1) then
execute immediate 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
end if;
end loop;
end;
/
更简单的方法是:
declare
n int := 0;
begin
select count(*) into n
from user_constraints
where constraint_name = 'FK_STATIONOBJECTSID'
and table_name = 'ATTENDANCE';
if n = 0 then
execute immediate 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
end if;
end;
/
成功了,但可能不是最好的解决方案:
DECLARE
foreign_key_exists number := 0;
BEGIN
SELECT COUNT(*) INTO foreign_key_exists FROM USER_CONSTRAINTS WHERE upper(CONSTRAINT_NAME) = upper('FK_StationObjectsID') AND upper(TABLE_NAME) = upper('Attendance');
IF (foreign_key_exists = 0)
THEN
EXECUTE IMMEDIATE 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
END IF;
END;
/
您可以在 SQL 查询中使用 EXISTS
,但不能像您尝试的那样在 PLSQL 条件中使用。
您可能需要以下内容:
declare
vCheck number;
begin
select count(1)
into vCheck
from user_constraints
where constraint_name = 'FK_STATIONOBJECTSID'
and table_name = 'ATTENDANCE';
--
if vCheck = 0 then
execute immediate 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
end if;
end;
如何执行 DDL,并忽略任何 "foreign key already exists" 错误。
不优雅,但不依赖于键名不变。
以下语句适用于 MSSQL:
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[FK_StationObjectsID]') AND parent_object_id = OBJECT_ID(N'[Attendance]'))
BEGIN
ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)
END
我在 Oracle 中尝试过:
IF NOT EXISTS (SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_STATIONOBJECTSID' AND TABLE_NAME = 'ATTENDANCE') THEN
BEGIN
ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid);
END;
但它给我一个错误 PLS-00103 "Encountered the symbol 'ALTER'..."
使用立即执行在 PLSQL 块内触发 ddl:
IF <condition> THEN
Execute immediate 'ALTER TABLE . . .';
END if;
最近不存在的是 Tom Kyte 给出的方法 here
begin
for i in (select count(*) cnt from dual
where not exists (
SELECT *
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_NAME = 'FK_STATIONOBJECTSID'
AND TABLE_NAME = 'ATTENDANCE'
)) loop
if (i.cnt = 1) then
execute immediate 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
end if;
end loop;
end;
/
更简单的方法是:
declare
n int := 0;
begin
select count(*) into n
from user_constraints
where constraint_name = 'FK_STATIONOBJECTSID'
and table_name = 'ATTENDANCE';
if n = 0 then
execute immediate 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
end if;
end;
/
成功了,但可能不是最好的解决方案:
DECLARE
foreign_key_exists number := 0;
BEGIN
SELECT COUNT(*) INTO foreign_key_exists FROM USER_CONSTRAINTS WHERE upper(CONSTRAINT_NAME) = upper('FK_StationObjectsID') AND upper(TABLE_NAME) = upper('Attendance');
IF (foreign_key_exists = 0)
THEN
EXECUTE IMMEDIATE 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
END IF;
END;
/
您可以在 SQL 查询中使用 EXISTS
,但不能像您尝试的那样在 PLSQL 条件中使用。
您可能需要以下内容:
declare
vCheck number;
begin
select count(1)
into vCheck
from user_constraints
where constraint_name = 'FK_STATIONOBJECTSID'
and table_name = 'ATTENDANCE';
--
if vCheck = 0 then
execute immediate 'ALTER TABLE Attendance ADD CONSTRAINT FK_StationObjectsID FOREIGN KEY (StationObjectsID) REFERENCES stationobjects (stationobjectsid)';
end if;
end;
如何执行 DDL,并忽略任何 "foreign key already exists" 错误。
不优雅,但不依赖于键名不变。