繁体   English   中英

以1:n设计删除两个表之间的一条记录

[英]Delete one record between two tables in 1: n design

我在MySql数据库中有两个表。 我很确定那些关系是否为1:n这是那些表:名为tb_karyawan的第一个表(英语中的karyawan是雇员)

MariaDB [db_egi]> select * from tb_karyawan where  NIK_KARYAWAN = 2;
+--------------+------------------+---------------+-------+-------------+-------+
| NIK_KARYAWAN | NAMA             | TGL_BERGABUNG | LEVEL | DEPARTEMENT | KELAS |
+--------------+------------------+---------------+-------+-------------+-------+
|            2 | Nurrahmi Massere | 2016-02-02    |     5 |           6 |     3 |
+--------------+------------------+---------------+-------+-------------+-------+
1 row in set (0.00 sec)

第二个表名为:tb_master_perhitungan:

MariaDB [db_egi]> select * from tb_master_perhitungan;
+----+---------------------+--------------+-------+-------+-------+-------+-------+------------+
| ID | PERIODE             | NIK_KARYAWAN | ID_C1 | ID_C2 | ID_C3 | ID_C4 | ID_C5 | STATUS     |
+----+---------------------+--------------+-------+-------+-------+-------+-------+------------+
| 13 | 2016-02-07 12:07:00 |            2 |     1 |     3 |     3 |     2 |     3 | UNAPPROVED   |
| 13 | 2016-01-07 09:00:28 |            2 |     2 |     3 |     3 |     2 |     3 | APPROVED   |
| 13 | 2015-12-07 15:47:18 |            2 |     3 |     3 |     3 |     2 |     3 | APPROVED   |

+----+---------------------+--------------+-------+-------+-------+-------+-------+------------+
3 rows in set (0.00 sec)

请查看以下字段:NIK_KARYAWAN。 关系是:tb_karyawan中有一条记录与tb_master_perhitungan中的许多记录相关。 我在HeidiSQL中这样设置关系:

| KEY NAME                              | COLUMN        | REFERENCE    | FOREIGN COLUMN   | ON UPDATE  |  ON DELETE  |
+--------------------------------------------------------------------------------------------------------------------+
| FK_tb_master_perhitungan_tb_karyawan  | NIK_KARYAWAN  | tb_karyawan  | NIK_KARYAWAN     | CASCADE    |  NO ACTION  |
+--------------------------------------------------------------------------------------------------------------------+

在UPDATE上很好,但是在删除时我遇到了问题。 问题是,当我决定删除tb_karyawan中的一行(即NIK_KARYAWAN = 2 ,我仍然希望保留与该NIK_KARYAWAN = 2有关系的记录在tb_master_perhitungan中,即使已在tb_karyawan中删除了NIK_KARYAWAN NIK_KARYAWAN = 2 这是错误:

Error Number: 1451

Cannot delete or update a parent row: a foreign key constraint fails (`db_egi`.`tb_master_perhitungan`, CONSTRAINT `FK_tb_master_perhitungan_tb_karyawan` FOREIGN KEY (`NIK_KARYAWAN`) REFERENCES `tb_karyawan` (`NIK_KARYAWAN`) ON DELETE NO ACTION ON UPDATE CASCADE)

DELETE FROM `tb_karyawan` WHERE `NIK_KARYAWAN` = '2'

我应该更改设计还是有其他解决方案? 任何解决方案都是如此。

在第二个表中,您必须进行外键约束,即ON DELETE CASCADE ON UPDATE CASCADE。 就像假设我有两个表jobeeker和job_status以及它们之间的一个外键,因此外键设置将像:-

CONSTRAINT `job_status_ibfk_1` FOREIGN KEY (`jobseeker_id`)
REFERENCES `jobseeker` (`jobseeker_id`) ON DELETE CASCADE ON UPDATE CASCADE

mysql中没有动作关系与限制动作相同,因此,要从主表中删除具有主键的记录时,必须先删除外键表中的所有相关记录。

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM