Уникальные значения только при совпадении данных в другом столбце

#mysql

#mysql

Вопрос:

У меня есть следующая таблица.

SQL-скрипка: http://sqlfiddle.com /#!2/8d142/1

 CREATE TABLE steps 
    (
        id int auto_increment primary key, 
        step_day varchar(10),
        title varchar(32), 
        description varchar(500),
        step_order tinyint unsigned not null
    );


-- Test insert
INSERT INTO steps
(step_day, title, description, step_order)
VALUES
('monday',   'Step 1', 'Do some stuff.', '1'),
('saturday', 'Step 1', 'Do some stuff.', '1'),
('monday',   'Step 2', 'Do some stuff.', '2'),
('saturday', 'Step 2', 'Do more stuff.', '2');
  

Данные в тестовой вставке в настоящее время в порядке, но я хотел бы защитить столбцы ‘title’ и ‘step_order’ от повторяющихся записей только в том случае, если данные в столбце ‘step_day’ совпадают.

Итак…

 ('monday',   'Step 1', 'Do some stuff.', '1'),
('monday',   'Step 1', 'Do some stuff.', '1')
  

… плохо, но…

 ('monday',   'Step 1', 'Do some stuff.', '1'),
('saturday', 'Step 1', 'Do some stuff.', '1')
  

…нормально.

Как мне это сделать? Спасибо.

Ответ №1:

 CREATE TABLE steps 
(
    id int auto_increment primary key, 
    step_day varchar(10),
    title varchar(32)not null, 
    description varchar(500),
    step_order tinyint unsigned not null,
    CONSTRAINT uc_steps UNIQUE (step_day,title,step_order)
);
  

это позволит вам иметь уникальные данные в step_day, title,step_order .

это позволит вам добавить

 INSERT INTO steps
(step_day, title, description, step_order)
VALUES
('monday',   'Step 1', 'Do some stuff.', '1'),
('saturday', 'Step 1', 'Do some stuff.', '1');
  

но не

 INSERT INTO steps
(step_day, title, description, step_order)
VALUES
('monday', 'Step 1', 'Do some stuff.', '1'),
('monday', 'Step 1', 'Do some stuff.', '1');
  

Ответ №2:

Вы должны использовать GROUP BY предложение

 SELECT id,
       step_day,
       title,
       description,
       step_order
FROM steps
GROUP BY step_day,title;
  

SQL скрипка