Database 创建具有最大行数的表(ORACLE)

Database 创建具有最大行数的表(ORACLE),database,oracle,rows,Database,Oracle,Rows,在Oracle中创建表时,有没有办法限制最大行数?您可以在“插入前”创建一个语句触发器,并在其中检查行数 CREATE OR REPLACE TRIGGER BI_MY_TABLE BEFORE INSERT ON MY_TABLE DECLARE CountRows NUMBER; BEGIN SELECT COUNT(*) INTO CountRows FROM MY_TABLE; IF CountRows > 100 THEN

在Oracle中创建表时,有没有办法限制最大行数?

您可以在“插入前”创建一个语句触发器,并在其中检查行数

CREATE OR REPLACE TRIGGER BI_MY_TABLE
    BEFORE INSERT ON MY_TABLE
DECLARE
    CountRows NUMBER;
BEGIN
    SELECT COUNT(*)
    INTO CountRows
    FROM MY_TABLE;

    IF CountRows > 100 THEN
        RAISE_APPLICATION_ERROR(-20001, 'Only 100 records are allowed');    
    END IF;
END;
/

但是,此触发器在多用户环境中无法正常工作。

如果表中有数字键,则可以添加一个检查约束,说明键未超过特定值:

ALTER TABLE turnip
ADD CONSTRAINT check_turnip_id
CHECK (turnip_id <= 50)
/
ALTER TABLE芜菁
添加约束检查\u turnip\u id

检查(turnip_id Trigger?这也是在每次插入时检查行数吗?AFAIK avoid Trigger我已经创建了一个触发器,因为最大行数是100,这对执行时间应该没有问题,但如果我在创建它时知道如何限制表的大小,那就太好了。您不能在触发它的触发器内对表执行Select。它将ll通过突变触发器错误。这不是行级触发器,其中的每行
子句都没有
。它可以工作!如果没有某种形式的锁定,触发器可能仍然允许超过100行,因为它不会“看到”并发但尚未提交的事务插入的行。例如:i)从空表开始,ii)在事务A中,插入99行,iii)在事务B中,插入99行,iv)提交事务A,v)提交事务B。在上下界具有唯一约束和检查约束的整数列是一个更健壮的解决方案。您还可以考虑使用检查约束对提交的实体化视图进行刷新。+ 1以更好地了解使用CHECK约束。它不应该是唯一的键吗?如果你想走这条路,你需要唯一的键,是的-但这将是一个单独的约束,可能是主键这正是我想的:)PK(或基于序列的列)使用对行数的检查约束,您可以通过使用负数或非整数轻松绕过此限制,除非您定义其他约束。从该表中删除anthing时,创建序列会出现问题,因为该序列会继续增加其值。自动填补已删除行的空白的简单方法是使用MINVALUE和MAXVALUE以及CYCLE创建序列;然后向应用程序中添加一些代码,以便在索引上获得DUP_VAL_时自动尝试另一个序列值;当然,如果表格“已满”,则需要一些退出策略(例如,只尝试50次以找到一个自由间隙)。当然,这种策略可能会影响性能。如果您只是想确保减小总体大小,可以让DBA设置一个小表空间(autoextend off或将maxsize设置为低值)。