我有两张桌子......表1有4列:'p_id','email','password','contact_number'.......''p_id'是主要的表1。
表2有5列,分别是:'p_id','password','email','contact_number','cust_id'.................. .here'p_id'作为表1中的外键。
现在我的问题是,如果我们在表1中插入三个字段,那么表2中的“相应”相同字段是否也可以使用表1中的相同值进行更新?
我是这个论坛的新手,如果我不符合提问礼仪的问题,那么道歉...... :)。
答案 0 :(得分:1)
我避免触发器,因为它们会引起额外的维护注意事项例如http://www.ducea.com/2007/07/25/dumping-mysql-stored-procedures-functions-and-triggers/。当然可以做到。但我怀疑SQL标准的作者希望使用外键来解决这个问题。
您可以使用多个索引添加FOREIGN KEY约束,因此如果我没有弄错,您可以使用这样的语法,以便在一个表中更改数据时,它也会在另一个表中更改。
http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html
[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION
话虽如此,我建议您查看https://en.wikipedia.org/wiki/Third_normal_form - 您不需要或想要在多个地方存储相同的信息。相反,正如其他人所建议的那样,http://dev.mysql.com/doc/refman/5.7/en/join.html - 当您从中选择表时,使用JOIN来组合表。
感谢您提供有关您的用例的说明:
实际上,这个概念是会有一个注册小组 用户将输入他的数据...这些将存储在第二个 表....现在当他/她登录时,这些数据将与他/她相匹配 将加载数据库中的详细信息
根据您的描述,您似乎根本不需要2个表。您存储它们的值,它们提供它们,并检查它们是否匹配。为什么你需要另一张桌子呢?只需执行一个WHERE子句来检查它们提供的值是否存在于数据库中。第二张桌子甚至在哪里?
我真诚地希望你考虑这个建议:认证是关于自己建立的最糟糕的事情,如果你正在学习,那么更是如此。您可能希望向相应的编程社区发布一个问题,该问题涉及使用可满足您需求的预构建的auth层。它可能会将数据存储在与您的数据库非常相似的数据库中,但会包含有价值的安全注意事项,不仅可以保护您,还可以保护您的用户。
例如,在数据库中存储纯文本密码是一种可怕的做法。如果您的网站遭遇数据访问权限泄露,例如https://en.wikipedia.org/wiki/SQL_injection,则会泄露用户的电子邮件和密码,并且在这种情况下,攻击者拥有可能在某些其他网站上使用的有价值的登录集网站(当然你永远不应该重复使用你的密码,但很明显很多人都会这样做)。现在,您已在整个互联网上公开了用户的帐户 。
https://en.wikipedia.org/wiki/Cryptographic_hash_function#Password_verification解释了通常只需要密码的单向哈希(例如sha256)来授权用户。如果您想要非常酷,您甚至可以在将数据发送到服务器之前进行哈希:https://softwareengineering.stackexchange.com/questions/76939/why-almost-no-webpages-hash-passwords-in-the-client-before-submitting-and-hashi。这是有效的,因为一个好的哈希不能被反转(你必须暴力,一个计算上无法维持的操作)但总是在相同的输入下产生相同的结果。
如果您开始编程,为什么不将auth留给开源解决方案并专注于应用逻辑的内容?这是专业人士所做的。
答案 1 :(得分:0)
使用AFTER INSERT触发器:
delimiter //
CREATE TRIGGER Table1_AI
AFTER INSERT ON Table1
FOR EACH ROW
BEGIN
UPDATE Table2 t2
SET t2.password = NEW.password,
t2.email = NEW.email,
t2.contact_number = NEW.contact_number
WHERE t2.p_id = NEW.p_id;
END;//
delimiter ;
这假设表2中已经存在要修改的行。如果可能不是,您可能希望在触发器的主体中使用INSERT...ON DUPLICATE KEY UPDATE...
语句。
祝你好运。
答案 2 :(得分:0)
经典非规范化问题。正确的解决方案是重新设计您的数据。这里真正的问题是两个表没有规范化,所以你有重复的数据。这违反了3NF,这是你的问题甚至存在的唯一原因。即使你用一些可怕的黑客来解决这部分问题,你还会遇到进一步同时更新两个表的问题,以及如果它们不同步又该怎么做(哪个是对的?)。 / p>
我看不出你甚至需要两个表的一个原因,但是如果你做第二个表应该只包含一个外键到第一个,然后是 isn'的所有数据的列第一个。在这种情况下,所有内容都从cust_id, ...