어떤 테이블이 특정 외래 키 값을 사용하는지 어떻게 알 수 있습니까?
내 MariaDB 데이터베이스에는 세 개의 테이블이 있습니다.Users
,Workers
그리고.Admins
어디서Users
테이블에 열이 있습니다.ID
기본 키로Workers
그리고.Admins
을 사용합니다.Users.ID
외부(및 기본) 키로 지정합니다.사용자는 작업자 또는 관리자가 될 수 있으며 둘 다 될 수 없습니다.어떻게 알 수 있습니까, 사용하여.Users.ID
그들이 근로자인지 관리자인지 여부
이 기능을 사용해 보았습니다.
CREATE FUNCTION workeroradmin(id INT)
RETURNS VARCHAR(20)
BEGIN
DECLARE type VARCHAR(20)
IF (SELECT COUNT(*) FROM Workers WHERE ID = id) = 1
THEN
SET type='Worker'
ELSEIF (SELECT COUNT(*) FROM Admins WHERE ID = id) = 1
THEN
SET type='Admin'
RETURN type;
END;
하지만 이렇게 하면 SQL 구문 오류가 발생할 수 있습니다.함수가 여기로 가는 길입니까, 아니면 단순한 IF 절로 충분합니까?
한 사용자가 작업자와 관리자를 동시에 사용할 수 없다고 확신하십니까?
대신에 저는 다음과 같은 것을 할 것입니다.
SELECT
Users.Id
, IF(Workers.Id IS NOT NULL, 1, 0) AS IsWorker
, IF(Admins.Id IS NOT NULL, 1, 0) AS IsAdmin
FROM
Users
LEFT JOIN Workers ON (Workers.Id = Users.Id)
LEFT JOIN Admins ON (Admins.Id = Users.Id)
WHERE
...
;
왼쪽 조인 대신 하위 쿼리를 사용하여 동일한 작업을 수행할 수 있습니다.
방법을 사용하려면 다음과 같은 작업을 수행할 수 있습니다.
DELIMITER $$
CREATE FUNCTION `workeroradmin`(`_id` INT)
RETURNS varchar(20)
LANGUAGE SQL
BEGIN
IF((SELECT `Id` FROM `Workers` WHERE `Id` = _id) IS NOT NULL) THEN
SET @result = 'Worker';
ELSEIF((SELECT `Id` FROM `Admins` WHERE `Id` = _id) IS NOT NULL) THEN
SET @result = 'Admin';
END IF;
RETURN @result;
END$$
DELIMITER ;
나는 COUNT를 단지 존재를 확인하기 위해 사용하지 않을 것입니다. 이것은 차선이기 때문입니다. 나도 마찬가지입니다.
이 솔루션이 당신에게 과도한 것인지는 모르겠지만 실제로 사용자를 작업자 "x" 또는 관리자로 강제할 수 있습니다.이 솔루션은 MariaDB 10.2.1부터 작동합니다.
복합 기본 키를 사용할 수 있습니다.CHECK
제약 조건(MariaDB 10.2.1 이상에서 실제로 작동)
예:
create table users (
id int not null,
type int not null check (type in (1, 2)),
name varchar(20),
primary key (id, type)
);
create table workers (
id int not null,
type int not null check (type = 1),
position varchar(20),
primary key (id, type),
foreign key (id, type) references users (id, type)
);
create table admins (
id int not null,
type int not null check (type = 2),
server varchar(20),
primary key (id, type),
foreign key (id, type) references users (id, type)
);
insert into users (id, type, name) values (100, 1, 'Anne'); -- worker
insert into workers (id, type, position) values (100, 1, 'Manager');
insert into users (id, type, name) values (105, 2, 'Tom'); -- admin
insert into admins (id, type, server) values (105, 2, 'server1');
insert into workers (id, type, position) values (105, 2, 'Programmer'); -- fails!
마지막 삽입이 실패하여 Tom은 관리자와 작업자가 동시에 될 수 없습니다. 이 작업은 사용자의 코드가 아닌 데이터베이스 수준에서 수행됩니다.
그렇다면 관리자인지 근로자인지 어떻게 알 수 있습니까?열을 보세요.type
논의 중인users
훨씬 간단하고 저렴합니다.
건배!
언급URL : https://stackoverflow.com/questions/59167864/how-can-i-find-out-which-table-uses-a-specific-foreign-key-value
'programing' 카테고리의 다른 글
mySQL에서 mariaDB 타임스탬프 메시업으로 전환 (0) | 2023.08.27 |
---|---|
백분율 높이 HTML 5/CSS (0) | 2023.08.27 |
VBA - XMLHTTP 및 WinHttp 요청 속도 (0) | 2023.08.27 |
@Temporal(TemporalType).날짜)(Oracle 12 포함) (0) | 2023.08.27 |
템플릿 구문 분석 오류: 'mat-icon'은(는) 알려진 요소가 아닙니다. (0) | 2023.08.27 |