Php 将分配表插入以防止重复

Php 将分配表插入以防止重复,php,mysql,Php,Mysql,我想为我的PHP函数创建一个语句,其中我有一个UserID和一个interestenid,并根据用户检查的内容更新我的userinteresten表。我不想在那张桌子上重复 但是,我在文档中发现,这不起作用,因为表中没有唯一的行集。 由于使用MySQL,我没有MERGE语句。 因为我从我的PHP函数中收到了InterestSenID,所以不需要加入。我尝试插入忽略描述,但返回错误1064 对于删除,我考虑首先将InterestsId设置为0,然后删除它们 各表: 使用者 兴趣 用户兴趣 我不工作

我想为我的PHP函数创建一个语句,其中我有一个UserID和一个interestenid,并根据用户检查的内容更新我的userinteresten表。我不想在那张桌子上重复

但是,我在文档中发现,这不起作用,因为表中没有唯一的行集。 由于使用MySQL,我没有MERGE语句。 因为我从我的PHP函数中收到了InterestSenID,所以不需要加入。我尝试插入忽略描述,但返回错误1064 对于删除,我考虑首先将InterestsId设置为0,然后删除它们

各表:

使用者

兴趣

用户兴趣

我不工作的尝试:

INSERT INTO userinteressen VALUES('$id','$interesse')
SELECT *
WHERE userinteressen.User IS NULL AND userinteressen.Interesse IS NULL;

INSERT IGNORE INTO `userinteressen`
SET `User`= 1
`Interesse`= 2;
更多信息: 我在用PDO。 UserInteresten表是使用phpmyadmin的接口创建的,因此我不知道数据库是什么样子

我导出了数据库以获得一些见解。我刚接触数据库,基本上都是理论。以下是引擎创建的语句:

--
-- Indices for Tabelle `userinteressen`
--
ALTER TABLE `userinteressen`
  ADD KEY `User` (`User`,`Interesse`),
  ADD KEY `Interesse` (`Interesse`);

--
-- Constraints of table `userinteressen`
--
ALTER TABLE `userinteressen`
  ADD CONSTRAINT `userinteressen_ibfk_1` FOREIGN KEY (`User`) REFERENCES `user` (`UserID`),
  ADD CONSTRAINT `userinteressen_ibfk_2` FOREIGN KEY (`Interesse`) REFERENCES `interessen` (`InteressenID`);

COMMIT;
谢谢

mysql替换:

你的用户兴趣中的用户和兴趣是a吗?然后可以使用mysql而不是INSERT:

REPLACE INTO `userinteressen`
SET `User`= 1
`Interesse`= 2;
“替换”的工作方式与“插入”完全相同,只是 表与主键或唯一键的新行具有相同的值 索引时,在插入新行之前删除旧行。看见 第13.2.6节,“插入语法”

但对于不受约束的利益,没有解决办法。因此,当用户取消选中一个或多个关系时,您需要删除UserInteresten中的关系

要删除的示例:

DELETE FROM `userinteressen` WHERE `Interesse` NOT IN (1,2,3) AND `User` = 1;
用所选兴趣id替换1,2,3

在插入之前删除所有关系:

还可以删除所有关系元组并再次插入当前选定的关系。这还允许用户取消选中兴趣并删除它:

// ...
DELETE FROM `userinteressen` WHERE `User` = 1
// ...
foreach($selectedInteressen as $id) {
    // ...
    INSERT INTO `userinteressen`
    SET `User`= 1
    `Interesse`= $id;
    // ...
}

注意:我不知道您使用的是哪个接口PDO、mysqli等等。。。?所以我简化了这个例子

我很困惑。既然我们不希望该表中存在重复项,为什么不通过在两列的组合上创建唯一索引来强制实施唯一约束呢?有了唯一的约束,我们可以使用INSERT IGNORE和INSERT。。。在重复键上,例如ALTER TABLE USERINTERSEN添加唯一键USERINTERSEN_UX1 user,INTERSEN。或者,我们可以将主键定义为复合键,即相同的两列。我们可能还需要一个以Interesten为前导列的索引。InnoDB将自动创建索引以支持外键。我没有实施唯一约束的原因是我没有意识到这种可能性。我刚接触数据库只有一年的时间,我们从MS Access开始。这是一个有用的信息,谢谢!更多关于我使用PDO作为接口的信息。我不知道你说的组合主键是什么意思。ALTER TABLE userinteresten`ADD KEY User User,intereste,ADD KEY interestse intereste;我正在更新我的帖子以获取更多信息。哦,它被称为复合主键,而不是组合主键。我更新了我的答案。它是多个字段上的主键。主键用户,感兴趣。
REPLACE INTO `userinteressen`
SET `User`= 1
`Interesse`= 2;
DELETE FROM `userinteressen` WHERE `Interesse` NOT IN (1,2,3) AND `User` = 1;
// ...
DELETE FROM `userinteressen` WHERE `User` = 1
// ...
foreach($selectedInteressen as $id) {
    // ...
    INSERT INTO `userinteressen`
    SET `User`= 1
    `Interesse`= $id;
    // ...
}