Реализация c/c ++ разрабатывает объединение как столбец в MySQL

Друзья,

Я имею странную потребность и не могу думать мой путь через проблему. Большой и могущественный Google имеет мало справки из-за переработки ключевого слова (как Вы будете видеть). Можно ли помочь?

То, что я хочу сделать, хранят данные нескольких типов в отдельном столбце в MySQL.

Это - база данных, эквивалентная объединению C (и если Вы ищете MySQL и Объединение, Вы, очевидно, получаете целый набор материала на ключевом слове ОБЪЕДИНЕНИЯ в SQL).

[Изобретенный и упрощенный случай следует] Так, давайте скажем, что у нас есть люди - у кого есть имена - и ШТУРМОВИКИ - у кого есть числа TK. У Вас не может быть И ИМЕНИ и числа TK. Вы - любой BOB SMITH - или TK409.

В C я мог выразить это как объединение, как так:

union {
        char * name;
        int tkNo;
      } EmperialPersonnelRecord;

Это делает его так, чтобы я или сохранил указатель на массив символов или идентификатор в типе EmperialPersonnelRecord, но не оба.

Я ищу MySQL, эквивалентный на столбце. Мой столбец сохранил бы или интервал или varchar (255) (или безотносительно комбинации). Но только занял бы место самого большого элемента.

Действительно ли это возможно?

(конечно, что-либо возможно, учитывая достаточное количество времени, деньги, и будет - я означать, это возможный, если я беден, ленив и на крайнем сроке... иначе "из поля"),

6
задан hat 9 January 2019 в 12:38
поделиться

4 ответа

Как сказал a1ex07, вы МОЖЕТЕ сделать это, сохранив строковое представление. Но если вас беспокоит пространство, хранение реальных значений в нескольких столбцах с NULLable, вероятно, сэкономит больше места.

В качестве альтернативы можно создать вспомогательные таблицы и нормализовать, например

Ваше желание:

TABLE1
|id|name_or_TK#|

Вы можете сделать:

TABLE1
|id|name|TK|

или вы можете сделать

TABLE1
|id|ST_or_human_flag|other columns common to humans and stormtroopers

TABLE2 - Names_of_humans
|id|name|

TABLE3 - TKs_of_STs
|id|TK|
4
ответ дан 17 December 2019 в 02:26
поделиться

Объединения C - довольно хитрый способ решения этой проблемы.

У вас есть полиморфный тип данных. Итак, один из способов решения проблемы - это переключиться на объектно-ориентированную БД, или БД с динамической типизацией, как некоторые из «NoSQL».

Если вам необходимо использовать текущую реляционную БД, вы можете сделать стандартную вещь, а именно создать какую-то ORM - объектно-реляционный преобразователь - для выполнения перевода. Один из способов - поместить общие («базовый класс») поля в основную таблицу вместе со столбцом типа, а затем использовать столбец типа, чтобы выбрать, какая таблица «конечного класса» содержит дополнительные поля. Например:

table Employee
    field id int
    field emp_type enum('human', 'stormtrooper')
    field salary int
    field division_id int
    field manager_id int

table HumanEmployee
    field emp_id int
    field name string

table StormtrooperEmployee
    field emp_id int
    field tk_number int

То есть таблицы * Employee связаны с базовой таблицей Employee по идентификатору сотрудника.

1
ответ дан 17 December 2019 в 02:26
поделиться

Нет, тип столбца «объединение» не существует. Но вы можете создать столбец, достаточно большой, чтобы вместить самый большой элемент, и еще один столбец, который будет работать как индикатор типа. Т.е.

... data VARCHAR(15), data_type enum('int','double','char')...
1
ответ дан 17 December 2019 в 02:26
поделиться

Я думаю, у вас должно быть 2 разных столбца и хранить данные соответственно, при извлечении вы можете преобразовать и добавить их вместе, например, col1 + col2 как full_name

0
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: