如何避免在两个不同的表中具有相同名称的两个字段在sql中采用相同的值?

时间:2015-05-09 23:46:35

标签: sql sql-server

如何避免在两个不同的表中使用两个具有相同名称的字段来获取相同的值? 例如,我有表客户:

cust_id   telephone   country
  1       03458902     UK  
  2       05868915     DE

另一方面,我有桌子卖家:

seller_id   telephone   country  
  1         07854264     GR  
  2         03458902     ES

在此示例中,电话号码是唯一的,因此卖家和客户不应该是同一部电话。 插入命令应该有一个警告:

insert into seller values(2,'03458902','ES')

我知道应该有以下内容:

create trigger .... before insert on seller

但我对这个词并不十分熟悉 我在MySQL中找到了一个例子。但是,我不知道如何将它从MySQL代码更改为SQL代码:

DROP TRIGGER IF EXISTS `unique_telephone_seller`;
DELIMITER //
CREATE TRIGGER `unique_telephone_seller` BEFORE INSERT ON `seller`
   FOR EACH ROW BEGIN
     DECLARE c INT;
        SELECT COUNT(*) INTO c FROM customer WHERE telephone = NEW.telephone;
        IF (c > 0) THEN
           -- abort insert, because foo.username should be NOT NUL
           SET NEW.telephone = NUL;
        END IF;
END

稍后编辑:

由于每个人都怀疑我的问题,让我解释为什么我有2张桌子。 我必须建立一个电信数据库。客户可以使用预付费和后付费SIM卡 所以我有一张表与客户(身份证,姓名,地址等),一张表用于预付费SIM卡(client_id,phone_no等)和一张表用于后付费SIM卡((client_id,phone_no等)。
客户端可以具有两种类型的SIM或相同类型的多个。这就是为什么我将SIM分成2个表格(而SIM卡根据类型有其他参数)。
所以为了没有重复的phone_no,在插入表之前我必须验证该数字是否在另一个表中。

问候//斯蒂娜

2 个答案:

答案 0 :(得分:0)

您可以在INSERT之前制作检查程序:

CREATE PROCEDURE dbo.Sample_Procedure 
    @seller_Id int,
    @telephone VARCHAR(8),  
    @country CHAR(2)
AS
    IF EXISTS (SELECT cust_id FROM customer WHERE telephone = @telephone)
        SELECT 'This phone number exists in customer table.'
    ELSE
        INSERT INTO seller VALUES(@seller_Id, @telephone, @country) 
RETURN 0 

答案 1 :(得分:0)

使用INSTEAD OF而不是for需要您处理插入逻辑。使用FOR允许您发出回滚,并让插入逻辑定期发生。

要使整个块失败,请务必将其包含在事务中。

// module.directive
function limit () {
  return {
    restrict: 'A'
  , replace: false
  , link: function (scope, elem, attrs) {
      var postText
        , buttonText = 'Read More'
        , limit = +attrs.limit
        , span = angular.element('<span/>')
        , button = 
            angular.element('<button/>')
              .on('click', function () {
                limit = limit < Infinity 
                  ? Infinity 
                  : +attrs.limit

                buttonText = limit < Infinity
                  ? 'Read More'
                  : 'Close'

                elem.init()
              })

      elem.init = function () {
        postText = scope.posts[attrs.id].text.substr(0, limit)
        button.text(buttonText)
        elem.append(span).text(postText).append(button)
      }
      elem.init()
    }
  }
}