Как создать / автоинкрементную направляющую на вставке без триггеров и ручных вставок в mysql? - PullRequest
2 голосов
/ 21 апреля 2020

Я снова посещаю свою базу данных и заметил, что у меня есть несколько первичных ключей типа INT.

Это было недостаточно уникально, поэтому я подумал, что у меня будет гид. Я пришел из Microsoft sql фона и в SMS-сообщениях вы можете выбрать тип «uniqeidentifier» и автоматически увеличить его.

В mysql однако я обнаружил, что вы должны создавать триггеры, которые выполняются при вставке для таблиц, для которых вы хотите сгенерировать идентификатор руководства. Пример:

Таблица:

CREATE TABLE `tbl_test` (
  `GUID` char(40) NOT NULL,
  `Name` varchar(50) NOT NULL,
  PRIMARY KEY (`GUID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Триггер:

CREATE TRIGGER `t_GUID` BEFORE INSERT ON `tbl_test`
 FOR EACH ROW begin
 SET new.GUID = uuid();

В качестве альтернативы вы должны вставить направляющую самостоятельно в бэкэнд.

Я не эксперт по БД, но все еще помню, что триггеры вызывают проблемы с производительностью.

Выше я нашел здесь и мне 9 лет, поэтому я надеялся, что что-то изменилось

Ответы [ 2 ]

3 голосов
/ 21 апреля 2020

Поскольку указано в документации , вы можете использовать uid() в качестве столбца по умолчанию, начиная с версии 8.0.13, поэтому что-то вроде этого должно работать:

create table tbl_test (
    guid binary(16) default (uuid_to_bin(uuid())) not null primary key,
    name varchar(50) not null
);

Это в значительной степени скопированы из документации. У меня недостаточно свежей версии MySQL, чтобы проверить это.

2 голосов
/ 21 апреля 2020

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

INSERT INTO  `tbl_test` VALUES  (uuid(),'testname');

Это будет генерировать новый uuid, когда вы его называете.

Или вы также можете использовать современный uuid v4 с помощью использование одной из этих функций вместо стандартного uuid (), который является более случайным, чем uuid в mysql

Как сгенерировать UUIDv4 в MySQL?

Вы можете использовать начиная с 8.0.13

CREATE TABLE t1 (
    uuid_field     VARCHAR(40) DEFAULT (uuid())
);

Но вы хотели больше, чем уникально, но здесь разрешены только внутренние функции и не определены пользователем, как для uuid v4, для этого вам нужен триггер

...