Друзья,
Я имею странную потребность и не могу думать мой путь через проблему. Большой и могущественный Google имеет мало справки из-за переработки ключевого слова (как Вы будете видеть). Можно ли помочь?
То, что я хочу сделать, хранят данные нескольких типов в отдельном столбце в MySQL.
Это - база данных, эквивалентная объединению C (и если Вы ищете MySQL и Объединение, Вы, очевидно, получаете целый набор материала на ключевом слове ОБЪЕДИНЕНИЯ в SQL).
[Изобретенный и упрощенный случай следует] Так, давайте скажем, что у нас есть люди - у кого есть имена - и ШТУРМОВИКИ - у кого есть числа TK. У Вас не может быть И ИМЕНИ и числа TK. Вы - любой BOB SMITH - или TK409.
В C я мог выразить это как объединение, как так:
union {
char * name;
int tkNo;
} EmperialPersonnelRecord;
Это делает его так, чтобы я или сохранил указатель на массив символов или идентификатор в типе EmperialPersonnelRecord, но не оба.
Я ищу MySQL, эквивалентный на столбце. Мой столбец сохранил бы или интервал или varchar (255) (или безотносительно комбинации). Но только занял бы место самого большого элемента.
Действительно ли это возможно?
(конечно, что-либо возможно, учитывая достаточное количество времени, деньги, и будет - я означать, это возможный, если я беден, ленив и на крайнем сроке... иначе "из поля"),
Как сказал 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|
Объединения 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 по идентификатору сотрудника.
Нет, тип столбца «объединение» не существует. Но вы можете создать столбец, достаточно большой, чтобы вместить самый большой элемент, и еще один столбец, который будет работать как индикатор типа. Т.е.
... data VARCHAR(15), data_type enum('int','double','char')...
Я думаю, у вас должно быть 2 разных столбца и хранить данные соответственно, при извлечении вы можете преобразовать и добавить их вместе, например, col1 + col2 как full_name