我想为我的PHP函数创建一个语句,其中有一个UserID
和一个InteressenID
,并根据用户检查的内容更新我的userinteressen
表。我不希望该表重复。
我在文档中找到了INSERT ... ON DUPLICATE KEY UPDATE
,但是,由于表中没有设置UNIQUE
行,因此无法正常工作。
由于要使用MySQL,因此没有MERGE
语句。
由于我从PHP函数中收到了InteressenID
,所以不需要JOIN
。我尝试INSERT IGNORE
描述了here,但返回了错误#1064
对于删除,我正在考虑先将InteressenID
设置为0,然后再将其删除。
表格:
用户
ID | Name
---+--------
1 | "Agathe"
2 | "Bernd"
3 | "Charlie"
Interessen
ID | Name
---+------------
1 | "Cars"
2 | "Sport"
3 | "Languages"
userinteressen
User | Interessen
-----+-----------
1 | 2
1 | 3
2 | 2
我不工作的尝试:
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。 通过使用phpmyadmin的界面创建了userinteressen-table,因此我对数据库的外观一无所知。
我导出数据库以获取一些见解。我是数据库的新手,并且大多具有理论知识。这是引擎创建的语句:
--
-- 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;
谢谢!
答案 0 :(得分:1)
mysql替换:
您的junction table User
中的Interesse
和userinteressen
是composite PRIMARY KEY吗?然后,您可以使用mysql REPLACE代替INSERT:
REPLACE INTO `userinteressen`
SET `User`= 1
`Interesse`= 2;
REPLACE的工作方式与INSERT完全相同,不同之处在于,如果 表具有与PRIMARY KEY或UNIQUE的新行相同的值 索引,则在插入新行之前删除旧行。看到 第13.2.6节“ INSERT语法”。
但是没有针对未经检查的“ interesse”的解决方案。因此,当用户取消选中一个或多个选项时,您需要删除userinteressen
中的关系。
要删除的示例:
DELETE FROM `userinteressen` WHERE `Interesse` NOT IN (1,2,3) AND `User` = 1;
用选定的Interesse ID替换(1,2,3)
在插入之前删除所有关系:
您还可以删除所有关系(元组)并再次插入当前选定的关系。这还允许用户取消选中“ interesse”及其删除的内容:
// ...
DELETE FROM `userinteressen` WHERE `User` = 1
// ...
foreach($selectedInteressen as $id) {
// ...
INSERT INTO `userinteressen`
SET `User`= 1
`Interesse`= $id;
// ...
}
注意:我不知道您使用的是哪个接口(PDO,mysqli,...?),所以我简化了示例