3

Может ли один столбец в таблице ссылаться на несколько таблиц?MYSQL - один столбец, ссылающийся на несколько таблиц

+1

Удостоверьтесь, что столбец может быть привязан к нескольким другим таблицам в качестве внешнего ключа или что столбец может ссылаться на несколько других таблиц, как в нескольких ограничениях внешнего ключа на один столбец? –

+1

Ничто не мешает вам создавать множественные ограничения внешнего ключа. Хотя я не могу придумать, почему это должно быть необходимо. –

+0

@ Майкл. Да, я имею в виду, что «столбец может ссылаться на несколько других таблиц, как на несколько внешних ключей». – rechie

ответ

0

Если вы имеете в виду «может ли столбец в одной таблице использоваться в качестве внешнего ключа в нескольких таблицах», тогда ответ ДА. В этом весь смысл реляционной базы данных

+0

Я имею в виду, что «столбец может ссылаться на несколько других таблиц» – rechie

1

Да, вы можете это сделать. вот пример того, как сделать это:

Вот таблица, которая имеет столбец (CountryId), который будет ссылаться на несколько таблиц:

CREATE TABLE DLAccountingSystem.tblCountry 
(
    CountryID  INT    AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    CountryName  VARCHAR(128) NOT NULL, 
    LastEditUser VARCHAR(128) NOT NULL, 
    LastEditDate DATETIME  NOT NULL 
) ENGINE=INNODB; 

Ниже приведены таблицы, которые собирается ссылаться на колонка (CountryId):

CREATE TABLE DLAccountingSystem.tblCity 
(
    CityID   INT    AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    CountryID  INT    NOT NULL, 
    CityName  VARCHAR(128) NOT NULL, 
    LastEditUser VARCHAR(128) NOT NULL, 
    LastEditDate DATETIME  NOT NULL 
) ENGINE=INNODB; 

CREATE TABLE DLAccountingSystem.tblProvince 
(
    ProvinceID  INT    AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    CountryID  INT    NOT NULL, 
    ProvinceName VARCHAR(128) NOT NULL, 
    LastEditUser VARCHAR(128) NOT NULL, 
    LastEditDate DATETIME  NOT NULL 
) ENGINE=INNODB; 

Вот как вы создаете ссылку на столбец:

ALTER TABLE DLAccountingSystem.tblCity 
ADD CONSTRAINT fk_tblcitycountryid FOREIGN KEY CountryID (CountryID) 
REFERENCES DLAccountingSystem.tblCountry (CountryID) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION 

ALTER TABLE DLAccountingSystem.tblProvince 
ADD CONSTRAINT fk_tblprovincecountryid FOREIGN KEY CountryID (CountryID) 
REFERENCES DLAccountingSystem.tblCountry (CountryID) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION 

вот таблица, в которой есть столбец, который ссылается на разные столбцы из нескольких таблиц (CountryID, ProvinceID, CityID) (я лично не консультирую этот метод структурирования таблицы. Просто мое мнение не обижайся;))

CREATE TABLE DLAccountingSystem.tblPersons 
(
    PersonID  INT   AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    PlaceID  INT   NOT NULL, 
    PlaceTypeID INT   NOT NULL, -- this property refers to what table are you referencing. 
//Other properties here..... 
) ENGINE=INNODB; 

вы также должны иметь справочную таблицу, которая будет содержать PlaceType:

CREATE TABLE DLAccountingSystem.tblPlaceType 
(
    PlaceTypeID  INT   AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    PlaceTypeName  INT   NOT NULL 
//Other properties here..... 
) ENGINE=INNODB; 

вот как вы запрашиваете его:

SELECT p1.PersonID, 
     tcity.CityName, 
     tprov.ProvinceName, 
     tcoun.CountryName 
FROM DLAccountingSystem.tblPersons p1 
LEFT JOIN (SELECT p2.PersonID, p2.PlaceTypeID, c.CityName FROM DLAccountingSystem.tblPersons p2 INNER JOIN DLAccountingSystem.tblCity c ON p2.ObjectID = c.CityID WHERE PlaceTypeID = @CityTypeID) tcity ON p1.PersonID = tcity.PersonID 
LEFT JOIN (SELECT p2.PersonID, p2.PlaceTypeID, c.ProvinceName FROM DLAccountingSystem.tblPersons p2 INNER JOIN DLAccountingSystem.tblProvince c ON p2.ObjectID = c.ProvinceID WHERE PlaceTypeID = @ProvinceTypeID) tprov ON p1.PersonID = tprov.PersonID 
LEFT JOIN (SELECT p2.PersonID, p2.PlaceTypeID, c.CountryName FROM DLAccountingSystem.tblPersons p2 INNER JOIN DLAccountingSystem.tblCountry c ON p2.ObjectID = c.CountryID WHERE PlaceTypeID = @CountryTypeID) tcoun ON p1.PersonID = tcoun.PersonID 

вас можно выбрать из других таблиц, таких как

+0

Я имею в виду, что «столбец может ссылаться на несколько других таблиц» – rechie

+0

да, это также возможно. но было бы очень сложно поддерживать реляционную целостность при реализации этого. У нас есть что-то подобное в нашей базе данных, используемой для уведомлений. Можете ли вы, пожалуйста, дать мне точный набор? –

0

Один и тот же столбец или набор столбцов могут выступать в роли родителя и/или в качестве дочернего конечной точки внешнего ключа или внешних ключей.

Смежные вопросы