Создание представления для таблиц с перекрывающимися идентификаторами

#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. Это должно быть «в представлениях». Такого ограничения нет. пример