programing

어떤 테이블이 특정 외래 키 값을 사용하는지 어떻게 알 수 있습니까?

newstyles 2023. 8. 27. 09:00

어떤 테이블이 특정 외래 키 값을 사용하는지 어떻게 알 수 있습니까?

내 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