有两表:A、B,都有字段id,name分别为PRIMARY KEY和UNIQUE KEY,现在我的需求是,向A或B中添加纪录,要求和另外一表中的id和name也要不重复,该怎么做比较好?第二问,我下面语句的本意是从A和B中查找出name为X的记录数,如果X的记录数不为0,说明X不可用,但实际的效果好像不对,各位帮我看看,谢谢!
select count(*) from A,B where  A.name = X or B.name = X;

解决方案 »

  1.   

    A B上各建立一个insert触发器
      

  2.   

    我用的mysql数据库,insert触发器是怎样的,能帮忙详细点吗?谢谢
      

  3.   

    http://www.cnblogs.com/hitwtx/archive/2011/07/25/2116014.html
      

  4.   

    select count(*) from A,B where  A.name = X or B.name = X;直接 select count(id) from B where name=X
    不就行了。B表内只要没X,那么就算A表里有也因为unique不能插入啊。
      

  5.   

    create trigger tr_reInsert on A
    INSTEAD OF  insert
    as
    declare @sno varchar(10)
    begin
    select @sno = name from inserted
    if  exists(select id from Bwhere type=@sno)
        begin
        PRINT('already exist in table B')
        rollback Tran
        end
    else
    begin
       insert into A(name) values(@sno)
    end
    end
      

  6.   

    你需要在 before insert / before update 中做检查http://blog.csdn.net/acmain_chm/article/details/4380183
    MySQL 中如何在触发器里中断记录的插入或更新?
    MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢? 下面是一种实现的方法。思路就是想办法在触发器中利用一个出错的语句来中断代码的执行。 mysql> create table t_control(id int primary key);Query OK, 0 row...
      

  7.   

    谢谢,我是通过存储过程来完成上面的操作的,如果只查一个表的话,就要写两个存储过程,A,B分别处理了,呵呵,我上面的语句在A、B表中都有记录的时候好像能行,但是,如果A中有X,B为空表,调用上面语句返回记录数为0.
      

  8.   

    insert触发器 的方式一下子搞不懂,暂时不打算考虑了,谢谢大家。
    对于避免id的重复问题,我通过设置B表的id,AUTO_INCREMENT = 20000来处理。(id插入以后是不会被修改的)。
    对于name的重复,可以通过一条sql语句查询出A、B两表的X记录数吗?谢谢!
      

  9.   

    谢谢大家,通过下面方法解决了,如果有记录就不能插入
    select name from A where name = X union select name from B where name = X;