比如我要限制整个表只能容纳100条记录. 
然后如果我想改变其容量了,再设置为比如200条记录为上限. 
麻烦了.谢谢

解决方案 »

  1.   

    1、instead of 触发器
    2、check约束(函数)
      

  2.   

    -->限制两条记录
    create table # (id int identity, data char(1), check(id<3))
    insert # select 'a'
    insert # select 'b'select * from #
    insert # select 'c' -->不能再插入数据
      

  3.   

    那比如先建个触发器限制为100条.
    如果想通过应用程序来传200这个参数该怎么做呢?因为我想把它改变为200条上限了,就比如VC+MS SQL2000吧.
    请各位指点.,谢谢
      

  4.   

    谢谢大家,还想问个问题 如果如Limpire 老大说的写的话,我想日后修改是不是很麻烦,比如我要把上限改为200了,该怎么办?我希望不动数据表,是不是应该建个触发器?
      

  5.   

    要么就程序实现,
    每次写入之前,count(*)一下数据库里面的值,
    然后给你这个固定的值比如说100做比较,
    如果count(*)<100则写入,
    反之,则提示用户超过限制!
      

  6.   

    create proc p_test
    @pid int,
    @pname nvarchar(20),
    @plimitcount int
    as
    begin
       declare @i int
       select @i = count(*) from tb
       if @i<@plimitcount
       begin
          insert into tb ....
       endend
      

  7.   

    谢谢各位.我用MYSQL写的:
    CREATE trigger T_PlayersNum
      before insert on Players for each row
      begin
      If (Select Count(distinct playerid) From Players) >200     
        Raiserror('不能超过200个',16,-1)   
        RollBack Tran   
        Return  
      End if
      End   这样对吗?
      

  8.   

    --写个存储过程
    CREATE    proc test11(@costNum int, @tableName varchar(20))
              as
    SET       nocount   ON
    DECLARE   @num int
    DECLARE   @str nvarchar(200)SET       @str='select @num=count(*) from '+@tableName
              exec sp_executesql @str,
              N'@num int out',
              @num out
    IF @num<=@costNum
              RETURN 0
    ELSE
              RETURN 1
    go
    --插入之前调用
    DECLARE   @s int
              EXEC @s=test11 10,'表名'--对"表名"的表限定10条
    SELECT    @s
    --返回1就不能插了,不过有可能会一次性插入多条时超过限定记录数
      

  9.   

    写存储过程的话我得每次插入都调用存储过程 call pro_name();这样和触发器相比 触发器是每次执行insert操作时自动调用的,相比之下哪个开销大些,就是说在这个情况下用存储过程好还是触发器好?请各位大哥指点,小弟欲知.
      

  10.   

    有一个问题,identity列的增长方式,如果插入失败,也会增长
      

  11.   

    我在表中的第一个字段就是自增性字段 从1开始 1为台步,插入达到200条时,字段playerid也就是200了.我就是想用这个来比较的.
    CREATE trigger T_PlayersNum
      before insert on Players for each row
      begin
      If (Select playerid From Players) >200 then
      Raiserror('不能超过200个',16,-1);
      End if;
      End$$MYSQL中这样写就可以了吧.
      

  12.   

    Count(distinct 字段)   只要字段是唯一性的,不是字增性就可以得到记录的数量了吧?
      

  13.   

    如果自增字段的某条记录删了,那下次插入时,不是接着按现有的最大值+1自增的,而是按原来删的那个值+1来自增
    如果作一个表来存这个200
    那触发器中就可以if (select playerid from Players)>(select 值 from 表) 这样来比较
    以后改200为100 或400只要改表中的值,而无需动触发器
      

  14.   

    太谢谢你的建议了.不过我还是不清楚MYSQL里的触发器怎么写,CREATE trigger T_PlayersNum
    before insert on Players for each row
    begin
    If (Select Count(distinct playerid) From Players) >=3 then
    Raiserror('不能超过3个',16,-1);
    RollBack Transaction;
    Return;
    End if;
    End;
    这样吗?我实在是找不到标准的 特别是Raiserror('不能超过3个',16,-1);请各位再指点一下 麻烦了
      

  15.   

    create proc p_test
    @pid int,
    @pname nvarchar(20),
    @plimitcount int
    as
    begin
       declare @i int
       select @i = count(*) from tb
       if @i<@plimitcount
       begin
          insert into tb ....
       endend
    这个就可以
      

  16.   

    select @i = count(*) from tb 这个有问题吧,要用sp_executesql
      

  17.   

    DELIMITER // 
    CREATE trigger T_PlayersNum 
    before insert on Players for each row 
    begin 
    If (Select Count(distinct accountnum) From Players) >=3 then 
    Raiserror('不能超过3个',16,-1); 
    RollBack Transaction; 
    Return; 
    End if; 
    End;// 
    delimiter ; 请问我这个触发器问题在哪里 每次执行到Raiserror('不能超过3个',16,-1);就出错.
      

  18.   

    求求你们帮我指点一下吧  MYSQL 的
    If (Select Count(distinct accountnum) From Players) >=3 then  
    Raiserror('不能超过3个',16,-1);  
    RollBack Transaction;  
    Return;  
    End if;  
    该怎么写才行,我要急死了
      

  19.   


    这边是SQL SERVER.........
      

  20.   

    因为MYSQL 那边人太少 所以只好来这里问问高手了..