我将主键定义为字符串值。所以两个元组的主键为" Hello"和"你好"因为主键不区分大小写,所以无法存在。
创建主键不区分大小写的表的sql语句是什么?
答案 0 :(得分:1)
您基本上需要使用子查询的检查约束。但由于在检查约束中不允许子查询,因此您可以编写一个运行查询并返回a的函数 结果:(假设您的PK被称为ID)
create or replace
FUNCTION check_id(ID_INPUT IN VARCHAR2)
RETURN NUMBER
IS count_id NUMBER;
Begin
SELECT count(*) INTO count_id FROM table WHERE UPPER(ID_INPUT) = UPPER(ID);
Return(Count_Id);
END;
然后在主键的检查约束中使用此功能
CHECK check_id(ID) = 0
试试这个并告诉我。尚未验证它的语法。
答案 1 :(得分:0)
具有由约束调用的用户定义函数是一种方法。缺点是每次插入行时都必须执行完整的表扫描 - 或者每当更新关键字段时都要执行,但是这不应该经常发生。此外,开发一个可以通过约束引用的udf并不总是那么容易。即使它被允许,该功能也必须满足关于确定性而不改变数据状态的严格要求。一些DBMS使这相对容易,其他DBMS则不这样做。
另一种选择是定义一个"阴影"领域。由插入和更新触发器填充的该字段将是转换为所有一种情况(上部或下部)的ID字段的内容。然后,阴影区域的唯一约束将满足您的需要。这也可以作为计算列实现,它们存在,但触发器会更好。如果是重复,则触发器可以截取异常并使用ID字段而不是名为罪魁祸首的影子来自行拦截。
此方法的缺点是您将包含密钥数据所需的空间增加了一倍。这可能是也可能不重要。
有趣的是,Oracle 12c引入了"隐形"柱。它的行为与任何其他列一样,除非必须明确引用,例如,它不会显示在select *
中。这对于这样一个不可见的列来说是完美的用途。