Я новичок в MySQL, исходящей из Oracle. У меня есть требование создать таблицу с первичным ключом в одном столбце, но со следующим форматом.
X-A
письмо с указанием страны происхождения, например. S
для Испании, Z
для Зимбабве e.tc(у нас есть только пять стран происхождения)
YYYYMMDD
- Дата в этом формате, 9999
- 4-значный офисный код. 9999999
- 7 правых заполненных порядковых номеров из последовательности в Oracle (автоматическое добавление в MySQL)
Это дает мне первичный ключ, например Z2010013150110000001
в качестве первичного ключа.
Мой вопрос заключается в том, как я могу сгенерировать часть 9999999
в MySQL. В Oracle это было бы
select 'Z'||to_char(sysdate, 'YYYYMMDD')|| 5011||cust_id.nextval from dual;
auto_increment не может быть просто частью поля, поэтому одним столбцом может быть стирка. Итак, как насчет:
CREATE TABLE xxxxx (
id int unsigned not null auto_increment,
rest_of_that_key char(xx) not null,
// other goodies
PRIMARY KEY (id)
);
Тогда вы можете SELECT CONCAT(rest_of_that_key, LPAD(id, 7, '0')) AS full_key FROM xxxxx
.
Или даже лучше, поэтому вы можете использовать эти служебные коды и даты для фильтрации данных с помощью:
CREATE TABLE xxxxx (
id int unsigned not null auto_increment,
country_code char(1) not null,
sysdate date not null,
office_code smallint unsigned not null,
// other goodies
PRIMARY KEY (id),
KEY country_code (country_code)
// etc, index the useful stuff
);
Затем вы можете использовать SELECT CONCAT(country_code, DATE_FORMAT(sysdate, '%Y%m%d'), office_code, LPAD(id, 7, '0')) AS full_key FROM xxxxx
и даже выбросить WHERE office_code = 1256 AND sysdate >= '2010-01-01'
, не имея необходимости каким-либо образом разобрать эту огромную строку.
Если вам действительно нужна эта огромная строка в качестве первичного ключа с одним полем, вы сами будете вручную наращивать все. Я по-прежнему не рекомендую делать это, хотя MySQL действительно любит, чтобы его PK были числовыми.