我有两个名为 users 和 packages 的表。
在用户中有一个名为" package"的列。在 packages 一个名为" id"。
的列中我想要完成的是,如果用户表中的包ID被更改为,请说" 1",然后来自users表的另一个字段叫" storage& #34;应该改为相应的" maxstorage"从包裹表...这里有一点说明:
数据库:
让我们说Joe想要升级到包裹号码2.然后在他的包裹被更换时应该更改他的存储量。它应该将来自packages表的maxstorage拖到users表中,然后在" storage" ...
列中我怎样才能做到这一点?
很难向我解释,如果有人得到它,请编辑以便于解释。
答案 0 :(得分:0)
您在查询中无法实现所需(或至少,不简单)。您必须将此逻辑移动到您的代码中,例如您有一个更改用户表中的行的查询。在该查询中,还要更新存储。
更好的是,完全删除users.storage_id。好的数据库不会重复。您已经拥有 packages 表中的数据,为什么要将其复制给用户?
SELECT users.name, packages.maxstorage
FROM users
LEFT JOIN packages ON (users.package_id = packages.id)
答案 1 :(得分:0)
可能是我没有正确理解你的问题,但是这个怎么样: (请对交易进行适当的考虑以避免冲突)。
CREATE TABLE P (ID INT, MAXSTORAGE INT);
CREATE TABLE U (USR_ID INT, PACKAGE_ID INT, STORAGE INT);
CREATE TRIGGER U_STORAGE_UPDATE BEFORE UPDATE ON U
FOR EACH ROW BEGIN
SET NEW.STORAGE = IF(NEW.PACKAGE_ID<>OLD.PACKAGE_ID , (SELECT MAXSTORAGE FROM P WHERE ID = NEW.PACKAGE_ID), NEW.STORAGE);
END;
INSERT INTO P VALUES (1,12345);
INSERT INTO P VALUES (2,54321);
INSERT INTO U VALUES (1,1,12000);
INSERT INTO U VALUES (2,2,60000);
SELECT * FROM U;
UPDATE U SET PACKAGE_ID=2 WHERE USR_ID=1;
SELECT * FROM U;
UPDATE U SET STORAGE=23
WHERE USR_ID=1;
SELECT * FROM U;
DROP TABLE P;
DROP TABLE U;
输出: 赌注
USR_ID PACKAGE_ID STORAGE
1 1 1 12000
2 2 2 60000
发布第一次更新
USR_ID PACKAGE_ID STORAGE
1 1 2 54321
2 2 2 60000
发布第二次更新
USR_ID PACKAGE_ID STORAGE
1 1 2 23
2 2 2 60000
答案 2 :(得分:0)
不回答问题但可能对您有用:
“用户”中的“包”列应在“包”中的“id”上具有外键约束。这可确保“package”列中的所有数据都与Packages表中的有效值相对应。否则,您可以在“包”列中输入一些数据,这些数据在“包”表中没有值。