0

두 개의 테이블 사용자와 관리자가 있습니다.MySQL과 캐스케이드 관계의 일대일 관계

+-------------------------+ 
| TABLE : user 
+-------------------------+ 
| id: PRIMARY_KEY 
| username 
| password 
+-------------------------+ 

+-------------------------+ 
| TABLE: admin 
+-------------------------+ 
| user_id: FOREIGN_KEY 
| e-mail 
+-------------------------+ 

관리자도 사용자이므로, 두 테이블이 모두 1 : 1의 관계에 있습니다. 사용자 테이블에서 행이 삭제되면 테이블 Admin에서도 제거됩니다 (admin.user_id는 ON DELETE CASCADE 관계로 설정 됨). 그러나 Admin 테이블에서 행을 삭제하면 어떻게됩니까? 그런 다음 User 테이블에서 제거되지 않으며 이로 인해 데이터베이스가 엉망이됩니다. 이것에 대한 해결책이 있습니까? 양측의 realtionship 만드는 법? 당신이 user 또는 admin 테이블에서 행을 제거 할 수 있습니다, 지금

ALTER TABLE user 
    ADD CONSTRAINT FK_user_admin_user_id FOREIGN KEY (id) 
    REFERENCES admin(user_id) ON DELETE CASCADE ON UPDATE RESTRICT; 

을하고, 관련 기록이 제거됩니다 -

답변

1

admin 테이블에 유사한 외래 키를 추가합니다.

FOREIGN_KEY_CHECKS 변수를 사용하여 새 레코드를 추가하십시오. - 출력

SET FOREIGN_KEY_CHECKS = 0; 

INSERT INTO user(id) VALUES(1); 
INSERT INTO admin(user_id) VALUES(1); 

SET FOREIGN_KEY_CHECKS = 1; 

전체 예 -

CREATE TABLE user (
    id int(11) NOT NULL AUTO_INCREMENT, 
    username varchar(255) DEFAULT NULL, 
    password varchar(255) DEFAULT NULL, 
    PRIMARY KEY (id), 
    CONSTRAINT FK_user_admin_user_id FOREIGN KEY (id) 
    REFERENCES admin (user_id) ON DELETE CASCADE ON UPDATE RESTRICT 
) 
ENGINE = INNODB; 

CREATE TABLE admin (
    user_id int(11) NOT NULL AUTO_INCREMENT, 
    `e-mail` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (user_id), 
    CONSTRAINT FK_admin_user_id FOREIGN KEY (user_id) 
    REFERENCES user (id) ON DELETE CASCADE ON UPDATE RESTRICT 
) 
ENGINE = INNODB; 

SET FOREIGN_KEY_CHECKS = 0; 

INSERT INTO user(id) VALUES(1); 
INSERT INTO user(id) VALUES(2); 
INSERT INTO user(id) VALUES(3); 

INSERT INTO admin(user_id) VALUES(1); 
INSERT INTO admin(user_id) VALUES(2); 
INSERT INTO admin(user_id) VALUES(3); 

SET FOREIGN_KEY_CHECKS = 1; 

DELETE FROM user WHERE id = 1; 
DELETE FROM admin WHERE user_id = 2; 

SELECT * FROM user; 
+----+----------+----------+ 
| id | username | password | 
+----+----------+----------+ 
| 3 | NULL  | NULL  | 
+----+----------+----------+ 

SELECT * FROM admin; 
+---------+--------+ 
| user_id | e-mail | 
+---------+--------+ 
|  3 | NULL | 
+---------+--------+ 
+0

모든 것이 작동합니다. 모든 사용자가 관리자가 아니기 때문에 문제는 하나뿐입니다. 나는 그 관계를 나쁘게 분명히했다. 오히려 제로 또는 하나의 관계입니다. – user3106462

+0

문제에 대해 더 자세히 알 수 있습니까? – Devart

+0

내 응용 프로그램에는 관리자, 교사 및 학생이 있습니다. 각 유형의 사용자는 그룹 운영에 대한 특성을 수행 할 수 있습니다 (예 : 교사 만 수업을 진행하고 학생에게는 친구가있는 경우 등). 하지만 그들 각각은 내 응용 프로그램의 사용자이며 로그인, 암호, 전자 메일, 이름, 성 등을 가지고 있습니다. 예를 들어 PHP에서 Student 클래스는 User 클래스를 상속합니다. 데이터베이스의 관점에서, 사용자는 공통 데이터 및 관리자, 교사, 특정 데이터에 대한 학생용 테이블입니다. – user3106462