在1:n design

时间:2016-02-07 08:17:44

标签: mysql

我在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时,我想仍然保留tb_master_perhitungan中与此NIK_KARYAWAN = 2甚至NIK_KARYAWAN = 2有关系的记录。在tb_karyawan中删除。 这是错误:

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'

我应该更改设计还是有其他解决方案? 任何解决方案都非常受欢迎。

2 个答案:

答案 0 :(得分:1)

在第二个表中,您必须创建外键约束,ON DELETE CASCADE ON UPDATE CASCADE。 就像假设我有两个表jobseeker和job_status以及它们之间的一个外键所以外键设置将是这样的: -

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

答案 1 :(得分:0)

mysql中没有任何操作关系将操作限制为与限制相同,因此当您想要使用主表中的主键删除记录时,必须先删除外键表中的所有相关记录。

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