创建检查 ID 是不是唯一的函数

Posted

技术标签:

【中文标题】创建检查 ID 是不是唯一的函数【英文标题】:Create function that checks if ID is unique创建检查 ID 是否唯一的函数 【发布时间】:2014-12-18 14:06:19 【问题描述】:

我想创建一个函数来检查我将插入的 ID 是否唯一。 这就是我所做的:

-- the function has to return true if ID is unique and false if ID is allready used(not unique)

  CREATE OR REPLACE FUNCTION Check_uniqueID
    ( p_ID IN STORE."ID"%TYPE)
    RETURN BOOLEAN
    AS 
      v_IsUnique BOOLEAN := FALSE;
    BEGIN
      ALTER TABLE STORE
      ADD CONSTRAINT check_unique_id UNIQUE (p_ID);
      -- how can i programm that he returns true if its unique and false if its not?
      v_IsUnique := TRUE;
      RETURN v_IsUnique;
    END;

提前致谢!

【问题讨论】:

这就是我现在所拥有的 CREATE OR REPLACE FUNCTION Check_uniqueID ( p_ID IN STORE."ID"%TYPE) RETURN BOOLEAN AS v_ID STORE."ID"%TYPE; v_IsUnique BOOLEAN := FALSE; BEGIN SELECT "ID" INTO v_ID FROM STORE WHERE "ID"=p_ID;如果 v_ID = NULL 那么 v_IsUnique := true; ELSE v_IsUnique := FALSE;万一;返回 v_IsUnique;结束; 为什么?您应该有一个具有自动生成值的唯一索引,强制它是唯一的。 【参考方案1】:

这里唯一的好习惯是使用唯一的约束和顺序。添加约束(你需要做一次):

ALTER TABLE STORE ADD CONSTRAINT check_unique_id UNIQUE (p_ID);

为 ID 创建序列(一次):

create sequence my_sequence;

INSERT 语句中使用它:

insert into STORE (id, another_field) 
values (my_sequence.nextval, 'some value for another field');

或:

insert into STORE (id, another_field) 
select my_sequence.nextval, one_more_field
  from some_table;

如果不想使用序列,则需要处理异常ORA-00001

【讨论】:

【参考方案2】:

在函数中使用ALTER TABLE 只是为了检查是否违反了约束是非常糟糕的做法。您应该永久拥有对表的约束,并在抛出 ORA-00001: unique constraint (constraint_name) violated 异常时处理它。您似乎也误解了ALTER TABLE 的语法,因为您试图在STORE.p_ID 的不存在列上添加约束。

但是,如果您必须使用函数来重现数据库通过检查约束提供的功能(用于 UI 中的预验证或类似内容),则可以这样做:

CREATE OR REPLACE FUNCTION check_uniqueid (p_id IN NUMBER)
RETURN BOOLEAN
AS
   li_count PLS_INTEGER;
BEGIN
   SELECT   COUNT(1)
   INTO     li_count
   FROM     store s
   WHERE    s.id = p_id;

   RETURN li_count = 0;
END;

【讨论】:

但是如果同时使用这仍然会很糟糕并且容易出错。如果两个进程插入相同的 ID,该函数将给两者一个 OK,因为它们只在 COMMIT 之后看到它们的更改。这就是为什么约束是唯一正确的方法! 同意,最终这听起来像是一个设计缺陷,表格上名为“id”的列可能应该通过序列填充。【参考方案3】:

您可以使用 SELECT 查询来检查值是否已存储在表中。

【讨论】:

以上是关于创建检查 ID 是不是唯一的函数的主要内容,如果未能解决你的问题,请参考以下文章

我们如何检查唯一 ID 的任意 2 个间隔是不是重叠?

当所有检索值在laravel中具有相同的会话键时,如何检查会话数组是不是具有唯一的ID

创建一个函数来检查表中是不是同时存在两个项目

如何在ios中检查(id)对象是不是为空?

有没有办法检查 laravel 5.2 中的几个输入是不是唯一?

触发函数来检查学生是不是有课