仅当另一列中的数据匹配时的唯一值

时间:2014-06-24 09:56:50

标签: mysql

我有下表。

SQL-Fiddle: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');

测试插页中的数据目前还可以,但我想保护列标题'和' step_order'仅在“步骤日”中的数据时从重复条目中获取列是一样的。

因此...

('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')

......没问题。

我该怎么做?谢谢。

2 个答案:

答案 0 :(得分:2)

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');

答案 1 :(得分:0)

您必须使用GROUP BY子句

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

SQL Fiddle