таблица mysql с полем первичного ключа varchar - PullRequest
0 голосов
/ 01 сентября 2018

Я создал таблицу пользователей со следующей структурой

CREATE TABLE `users` (
   `id` varchar(36) NOT NULL,
   `first_name` varchar(100) NOT NULL,
   `last_name` varchar(100) NULL,
   `email` varchar(100) NOT NULL,
   `password` varchar(100) NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Я просто хочу автоматически заполнить значение id при вставке новой строки.

Ответы [ 5 ]

0 голосов
/ 02 сентября 2018

Согласно Кулинарная книга 3.x :

Вместо того, чтобы использовать автоинкрементный ключ в качестве первичного ключа, вы можете также используйте char (36). Затем CakePHP будет использовать уникальный UUID из 36 символов (Text :: uuid) всякий раз, когда вы сохраняете новую запись, используя Table :: save () способ.

Означает, что CakePHP автоматически сохраняет уникальный 36 символов UUID (Text :: uuid) всякий раз, когда вы сохраняете новую запись, используя метод Table :: save ().

Просто измените

 id varchar(36) NOT NULL

до

 id char(36) NOT NULL

Надеюсь, это поможет!

0 голосов
/ 01 сентября 2018

Если вы хотите сгенерировать uuid в сочетании с триггером, тогда у вашей таблицы есть некоторые проблемы, например

drop table if exists t;
CREATE TABLE t (
   `id` varchar(36) not null,
   `first_name` varchar(100) NOT NULL,
   `last_name` varchar(100) NULL,
   `email` varchar(100) NULL,
   `password` varchar(100) NULL ,
    PRIMARY KEY (`id`)
) ;

drop trigger if exists t;
delimiter $$
create trigger t before insert on t
for each row 

begin

        set new.id = (select uuid());

end $$

delimiter ;
truncate table t;
insert into t (first_name) values (1),(2);
ERROR 1364 (HY000): Field 'id' doesn't have a default value

И вы не можете использовать значение по умолчанию, потому что при попытке вставить (2) возникнет повторяющаяся ошибка; И вы не можете изменить ненулевое значение на нулевое, потому что первичный ключ должен иметь значение.

Вы можете изменить идентификатор на ноль и изменить первичный ключ на уникальный ключ

drop table if exists t;
CREATE TABLE t (
   `id` varchar(36) null,
   `first_name` varchar(100) NOT NULL,
   `last_name` varchar(100) NULL,
   `email` varchar(100) NULL,
   `password` varchar(100) NULL ,
    unique key (`id`)
) ;

drop trigger if exists t;
create trigger t before insert on t
for each row 
        set new.id = (select uuid());


truncate table t;
insert into t (first_name) values (1),(2);
select * from t;
+--------------------------------------+------------+-----------+-------+----------+
| id                                   | first_name | last_name | email | password |
+--------------------------------------+------------+-----------+-------+----------+
| 874bd297-adeb-11e8-b404-b8aeed249e19 | 1          | NULL      | NULL  | NULL     |
| 874bda27-adeb-11e8-b404-b8aeed249e19 | 2          | NULL      | NULL  | NULL     |
+--------------------------------------+------------+-----------+-------+----------+
2 rows in set (0.00 sec)
0 голосов
/ 01 сентября 2018

Попробуйте id int(11) NOT NULL AUTO_INCREMENT,

CREATE TABLE `users` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `first_name` varchar(100) NOT NULL,
   `last_name` varchar(100) NULL,
   `email` varchar(100) NOT NULL,
   `password` varchar(100) NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
0 голосов
/ 01 сентября 2018

Если вы хотите автоматически сгенерированный GUID для первичного ключа, это возможно только в MySql с использованием триггера.

CREATE TRIGGER before_insert_users
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
  IF new.id IS NULL THEN
    SET new.id = uuid();
  END IF;
END

Более подробную информацию можно найти здесь: https://www.electrictoolbox.com/mysql-guid-uuid-default-column/

0 голосов
/ 01 сентября 2018

Вы пытаетесь автоматически увеличить столбец VARCHAR. Вы не можете сделать это & ​​trade ;.

Столбцы VARCHAR, содержащие текст целых чисел, как известно, трудно правильно ЗАКАЗАТЬ.

В MySQL автоматически заполненный (автоинкрементный) столбец ID должен иметь целочисленный тип данных.

Попробуйте изменить

    `id` varchar(36) NOT NULL,

до

    `id` UNSIGNED BIGINT NOT NULL AUTO_INCREMENT,

(Я выбрал UNSIGNED BIGINT, потому что это самое большое доступное целое число, и ваш выбор 36 в вашем VARCHAR (36) позволяет сделать вид, что вы ожидаете огромное количество строк в этой таблице. Но UNSIGNED INT даст вам четыре гигаруса , что, вероятно, достаточно.)

Если вы решите использовать триггер или другие средства для генерации значений автоинкрементации для столбца VARCHAR ID, вам придется проделать большую тяжелую работу с транзакциями, чтобы избежать возможности дублирования значений.

Если ваше клиентское программное обеспечение должно видеть этот столбец как VARCHAR, вы можете сделать это в представлении или выбрать. SELECT CAST(id AS VARCHAR(36)) id делает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...