满足所有条件时防止重复的MYSQL条目

时间:2014-03-31 19:42:21

标签: php mysql database-design

我对php和mysql很陌生,所以当我试着解释我的目标时,请耐心等待。

我有一个在线表单,它将获取信息并将其放入MYSQL数据库。该功能完美无缺,但现在我想尽可能减少重复的条目。

我们的员工将在数据库中输入客户名称,帐单邮寄地址和送货地址。有些客户有多个帐单邮寄地址和送货地址。我想做的是使它如果这3个中的任何一个是新条目,则保存记录,但如果所有3都是重复,则它不会被插入到数据库中。我希望这样的事情可以解决问题:

$cn = $_POST[CustomerName];
$ba = $_POST[BillingAddress];
$sa = $_POST[ShippingAddress];
$custname = mysqli_query("SELECT DISTINCT customerName FROM customer WHERE customerName LIKE '$cn'");
$billaddress = mysqli_query("SELECT DISTINCT billingaddress FROM customer WHERE billingaddress LIKE '$ba'");
$shipaddress = mysqli_query("SELECT DISTINCT shippingaddress FROM customer WHERE shippingaddress LIKE '$sa'");



if ($custname != $_POST[CustomerName] OR $billaddress != $_POST[BillingAddress] OR $shipaddress != $_POST[ShippingAddress])
    {
    mysqli_query($con,"INSERT INTO customer(customerName, billingaddress, shippingaddress)
VALUES
('$_POST[CustomerName]','$_POST[BillingAddress]','$_POST[ShippingAddress]')");
    }

不幸的是,当所有三个参数都是重复时,这仍会添加记录。关于为什么会发生这种情况的任何想法,或者关于如何使我想要的结果更容易的任何建议?

我已尝试将客户名称字段设为唯一,但在这种情况下,它会删除整个记录。如果我理解正确,主键/唯一方法将无法用于我的问题。这可能是我缺乏经验的谈话,所以如果有人能帮助我,我会非常感激。

编辑:我想我还提到我尝试过使用mysql_real_escape_string方法和数组返回方法无济于事。

表格定义如下:

**customer**
idcustomer (primary key, auto-increment)
customerName
billingaddress
shippingaddress

1 个答案:

答案 0 :(得分:0)

我建议使用触发器通过BEFORE操作来控制交易的逻辑。

DELIMITER $$
CREATE TRIGGER tbl_noduplicate
BEFORE INSERT ON tbl
FOR EACH ROW
BEGIN
  IF (EXISTS(SELECT * FROM tbl WHERE col1 = NEW.col1)) THEN
    INSERT INTO tbl (col1,col2,col3)   
    VALUES (NEW.col1, NEW.col2, NEW.col3);
  END IF;
END$$
DELIMITER ;

好的 - 这就是我的想法:
1-这里是一个我认为你应该实施的新数据模型:
当一个客户有一个或多个送货地址或帐单地址时 enter image description here

以下是执行此操作的代码:

CREATE TABLE IF NOT EXISTS customer (
  idcustomer int(11) NOT NULL DEFAULT 0,
  customerName varchar(30) DEFAULT NULL,
  customer_email varchar(30) DEFAULT NULL,
  PRIMARY KEY (idcustomer)
);


CREATE TABLE IF NOT EXISTS ref_address_type (
  address_type_code int(11) DEFAULT NULL,
  address_type_desc varchar(30) DEFAULT NULL,
  UNIQUE INDEX UK_ref_address_type_address_ty (address_type_code)
);

CREATE TABLE IF NOT EXISTS customer_address (
  idaddress int(11) NOT NULL DEFAULT 0,
  fk_idcustomer int(11) DEFAULT NULL,
  street varchar(100) DEFAULT NULL,
  street_number int(11) DEFAULT NULL,
  house_app_number int(11) DEFAULT NULL,
  city varchar(50) DEFAULT NULL,
  country varchar(50) DEFAULT NULL,
  zipcode int(11) DEFAULT NULL,
  fk_address_type_code int(11) DEFAULT NULL,
  PRIMARY KEY (idaddress),
  CONSTRAINT FK_customer_address_customer_idcustomer FOREIGN KEY (fk_idcustomer)
  REFERENCES customer (idcustomer) ,
  CONSTRAINT FK_customer_address_ref_address_type_address_type_code FOREIGN KEY (fk_address_type_code)
  REFERENCES ref_address_type (address_type_code) 
);