#mysql #sql
#mysql #sql
Вопрос:
Учитывая две таблицы Cat
и Dog
Таблица Cat
содержит следующие столбцы: id
, name
, weight
, height
, <special columns just for cat>
Таблица Dog
содержит следующие столбцы: id
, name
, weight
, height
, <special columns just for dog>
И мы хотим создать Animal
представление: id
, name
, weight
, height
.
Типы данных те же. Оба id
начинаются с 0.
Простой вариант с перекрывающимися id
:
CREATE OR REPLACE VIEW Animal(id, name, weight, height) as
(SELECT
id,
name,
weight,
height
FROM Cat)
UNION
(SELECT
id,
name,
weight,
height
FROM Dog);
Но нам нужен какой-то первичный ключ в таблице Animal и способ ссылаться на них как на кошку или собаку, если это необходимо.
Итак, я создал эту альтернативу, которая позволяет нам создавать первичный ключ из id
и type
. Но type — это varchar, так что, возможно, это не так эффективно. Есть ли лучший подход к этому?
CREATE OR REPLACE VIEW Animal(id, type, name, weight, height) as
(SELECT
id,
"Cat",
name,
weight,
height
FROM Cat)
UNION
(SELECT
id,
"Dog",
name,
weight,
height
FROM Dog);
Ответ №1:
Добавьте столбец, указывающий тип.
CREATE OR REPLACE VIEW Animal as
SELECT id, name, weight, height, 'Cat' as type
FROM Cat
UNION ALL
SELECT id, name, weight, height, 'Dog' as type
FROM Dog;
Тогда уникальный ключ представляет собой комбинацию type
и id
.
К сожалению, MySQL не разрешает подзапросы в FROM
предложении для представлений. Это немного усложняет добавление уникального номера строки для каждой строки (это возможно). Итак, я бы рекомендовал просто придерживаться составного уникального ключа.
Комментарии:
1. Я предполагаю, что в вашем примере отсутствует столбец «тип» в представлении Animal, правильно? Не могли бы вы уточнить, что делает «как тип»?
2. Похоже, нет никакой разницы между «Cat» или «Cat» как типом»
3. @Lucas . , , Перечисление столбцов не требуется, поэтому я просто удалил их. Вы должны использовать одинарные кавычки для строковых констант. Это стандарт SQL.
4. Какова актуальность типа as? Почему бы просто не использовать «Cat» или «Dog» вместо «Cat» в качестве типа?
5. Это должно быть «в представлениях». Такого ограничения нет. пример