Может ли один столбец в таблице ссылаться на несколько таблиц?MYSQL - один столбец, ссылающийся на несколько таблиц
ответ
Если вы имеете в виду «может ли столбец в одной таблице использоваться в качестве внешнего ключа в нескольких таблицах», тогда ответ ДА. В этом весь смысл реляционной базы данных
Я имею в виду, что «столбец может ссылаться на несколько других таблиц» – rechie
Да, вы можете это сделать. вот пример того, как сделать это:
Вот таблица, которая имеет столбец (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
вас можно выбрать из других таблиц, таких как
Я имею в виду, что «столбец может ссылаться на несколько других таблиц» – rechie
да, это также возможно. но было бы очень сложно поддерживать реляционную целостность при реализации этого. У нас есть что-то подобное в нашей базе данных, используемой для уведомлений. Можете ли вы, пожалуйста, дать мне точный набор? –
Один и тот же столбец или набор столбцов могут выступать в роли родителя и/или в качестве дочернего конечной точки внешнего ключа или внешних ключей.
Удостоверьтесь, что столбец может быть привязан к нескольким другим таблицам в качестве внешнего ключа или что столбец может ссылаться на несколько других таблиц, как в нескольких ограничениях внешнего ключа на один столбец? –
Ничто не мешает вам создавать множественные ограничения внешнего ключа. Хотя я не могу придумать, почему это должно быть необходимо. –
@ Майкл. Да, я имею в виду, что «столбец может ссылаться на несколько других таблиц, как на несколько внешних ключей». – rechie