2015-10-24 143 views
0

我想插入数据到Mysql中,并且当数据已经在表中时,不应该再次插入。如何防止第二次插入?如何防止重复插入表

try { 
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); 
    // set the PDO error mode to exception 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $sql = "INSERT INTO MyGuests(firstname, lastname, email) 
    VALUES ('John', 'Doe', '[email protected]')"; 

    // use exec() because no results are returned 
    $conn->exec($sql); 
    echo "Table MyGuests created successfully"; 
} catch(PDOException $e) { 
    echo $sql . "<br>" . $e->getMessage(); 
} 

$conn = null; 

的结果是这样的:

enter image description here

+1

添加一个唯一约束条件 –

回答

0

您不必对电子邮件地址一个独特的密钥。这是你最大的希望,因为许多John Doe可以进入这个体系。所以一个独特的全名综合指数并不是一个好主意。

一个人可以发出一个INSERT IGNORE,它会在重复的违规行为发生后像没有任何事情发生一样(这是非常不推荐的,在您的情况下不可能,因为您对电子邮件的唯一限制不存在)。这样做的主要问题是,你的倾向(阅读:可能会)失去对所发生事件流的全部控制,并留下不希望的数据。所以不要使用它,除非你是专业人士。

可以发行并且INSERT ON DUPLICATE KEY UPDATE(又名IODKU)也需要唯一的密钥(也可以是唯一的组合)。因此,新行不会发生,而是行的更新。举例来说,可以插入具有4列的新行,但是在违反重复的情况下,可以在仅两个列上执行更新,例如

假设在未知列id int的PK下面,上的唯一密钥emailAddr

insert person(firstName,lastName,emailAddr) values 'Joe','Smith','[email protected]' 
on duplicate key update firstName='Joe',lastName='Smith' 

这是使这项工作的唯一键上的emailAddr。每个emailAddr只剩下一行,永远。

因此,您可以拥有无​​限的Joe Smiths,但每个电子邮件地址只有一行。

的用于上表中创建表可能看起来像

create table person 
( id int auto_increment primary key, 
    firstName varchar(50) not null, 
    lastName varchar(50) not null, 
    emailAddr varchar(150) not null, 
    unique key(emailAddr) -- without this, IODKU will not work 
); 

还可以发出ALTER TABLE命令在创建表后添加的约束。根据其中的数据,呼叫可能会失败。

Mysql Insert on Duplicate Key UpdateAlter Table手册页。

我会再说一遍,没有适当的架构设置,IODKU将无法正常工作,您将留下不需要的行。所以不要懒惰。设置模式第一个允许它成功(使用唯一键),然后继续使用IODKU。

+0

我试过了你的代码,没关系。谢谢。 – Nola

+0

欢迎来到堆栈。当您找到解决问题的答案,我的,戈登或其他人的答案时,请将其标记为绿色复选标记的答案。谢谢。 – Drew

0

您需要添加一个唯一的约束/索引并忽略由重复引起的错误。如果这是您的查询:

INSERT INTO MyGuests(firstname, lastname, email) 
    VALUES ('John', 'Doe', '[email protected]'); 

而且要防止被重新插入所有三列,那么你可以添加独一无二的,因为:

create unique index unq_myguests_firstname_lastname_email on myguests(firstname, lastname, email); 

然后,短语insert为:

INSERT INTO MyGuests(firstname, lastname, email) 
    VALUES ('John', 'Doe', '[email protected]') 
    ON DUPLICATE KEY UPDATE firstname = VALUES(firstname); 

ON DUPLICATE KEY UPDATE部分什么都不做,只是忽略错误。