dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

MySQL で主キーではないカラムでユニーク化

2022-08-30 23:27:00 | mysql
MySQL で主キーではないカラムでユニーク化する方法のメモ。
以下のテーブルで主キーではない id でユニーク化します。
create table test1 (
  id    varchar(16) not null,
  key1      varchar(16) not null,
  key2      varchar(16) not null,
  key3      varchar(16) not null,
  data      varchar(16) not null default '',

  primary key(key1, key2, key3),
  index(id)
);

insert into test1 set id = 'prd_01', key1 = 'a', key2 = 'a', key3 = '01', data = 'a';
insert into test1 set id = 'prd_01', key1 = 'a', key2 = 'a', key3 = '02', data = 'a';

insert into test1 set id = 'prd_02', key1 = 'b', key2 = 'b', key3 = '01', data = 'b';
insert into test1 set id = 'prd_02', key1 = 'b', key2 = 'b', key3 = '02', data = 'b';
insert into test1 set id = 'prd_02', key1 = 'b', key2 = 'b', key3 = '03', data = 'b';

insert into test1 set id = 'prd_03', key1 = 'c', key2 = 'c', key3 = '01', data = 'c';
insert into test1 set id = 'prd_03', key1 = 'c', key2 = 'c', key3 = '02', data = 'c';

以下では主キーの key1、key2、key3 を \t で連結し、文字列的に最小の値となるレコードでユニーク化します。
select
  t1.id as id
  , t1.data as data
from
  test1 t1
left join
(
  select
    id
    , min(concat(key1, '\t', key2, '\t', key3)) as k
  from
    test1
  group by
    id
) tk
on
  tk.k = concat(t1.key1, '_', t1.key2, '_', t1.key3)
where
  tk.k is not null
;

■実行結果
id      data
prd_01  a
prd_02  b
prd_03  c


MySQL の起動方法

2022-08-30 23:23:57 | mysql
MySQL の起動方法のメモ。
sudo systemctl start mysqld