2016-02-15 2 views
1

У меня есть таблица с большим количеством столбцов, среди которых поля года, папку и seq_no служить в качестве способа идентификации для записи. Я хотел бы назначить один и тот же идентификатор для тех записей, у которых эта комбинация одинакова, и (если возможно) общее количество идентификаторов должно быть последовательным, чтобы использовать значения столбцов идентификатора. Пример:Назначают же идентификатор к строкам с таким же комбинацией данных

+-----+-----+------+------+-----+ 
| id |year |folder|seq_no|count| 
+=====+=====+======+======+=====+ 
| 1 |1973 | 5 | 11 | 2 | << 1973, 5, 11 
+-----+-----+------+------+-----+ 
| 2 |2010 | 4 | 7 | 2 | << 2010, 4, 7 
+-----+-----+------+------+-----+ 
| 3 |1973 | 11 | 12 | 1 | << 1973, 11, 12 
+-----+-----+------+------+-----+ 
| 1 |1973 | 5 | 11 | 2 | << 1973, 5, 11 
+-----+-----+------+------+-----+ 
| 4 |1500 | 4 | 7 | 1 | << 1500, 4, 7 
+-----+-----+------+------+-----+ 
| 2 |2010 | 4 | 7 | 2 | << 2010, 4, 7 
+-----+-----+------+------+-----+ 

Однако, я бы предпочел, что идентификатор не назначается по расчету в PHP части, но сама таблица на каждой новой проверке входа, если эта запись имеет ту же комбинацию, как другие. Если да, назначьте тот же идентификатор. Если нет, назначьте следующий доступный идентификатор.

Кроме того, я хотел бы подсчитать для каждой строки количество записей с одним и тем же идентификатором, и это также должно быть сделано автоматически.

Я думал об использовании триггеров или функций ... не уверен, как это сделать.

ответ

1

Я бы не пытайтесь хранить такие идентификаторы и особенно COUNT в таблице.

Представьте себе, что в вашем примере вы хотите вставить еще один ряд с

+-----+------+------+ 
|year |folder|seq_no| 
+-----+------+------+ 
|1973 | 5 | 11 | 
+-----+------+------+ 

Сервер должен найти все существующие строки с той же комбинации и обновлять их с новым значением COUNT.

Каждый INSERT, UPDATE и DELETE становится действительно дорогим.

Этот вид информации может быть вычислена при необходимости с DENSE_RANK и COUNT:

SELECT 
    year 
    ,folder 
    ,seq_no 
    ,DENSE_RANK() OVER(ORDER BY year, folder, seq_no) AS ID 
    ,COUNT(*) OVER(PARTITION BY year, folder, seq_no) AS cnt 
FROM YourTable 
0

вы можете создать уникальный индекс базу по нескольким столбцам, как так:

CREATE UNIQUE INDEX year_folder_seqNo ON my_table (year, folder, seq_no); 

Это позволит предотвратить многократную вставку с одинаковыми значениями (таким образом, вы будете иметь только 1 строку для каждой комбинации)

1

ли это во время запроса:

with t (year, folder, seq_no) as (values 
    (1973,5,11), 
    (2010,4,7), 
    (1973,11,12), 
    (1973,5,11), 
    (1500,4,4), 
    (2010,4,7) 
) 
select 
    dense_rank() over (order by year, folder, seq_no) as id, 
    year, folder, seq_no, 
    count(*) over (partition by year, folder, seq_no) as "count" 
from t 
; 
id | year | folder | seq_no | count 
----+------+--------+--------+------- 
    1 | 1500 |  4 |  4 |  1 
    2 | 1973 |  5 |  11 |  2 
    2 | 1973 |  5 |  11 |  2 
    3 | 1973 |  11 |  12 |  1 
    4 | 2010 |  4 |  7 |  2 
    4 | 2010 |  4 |  7 |  2 
Смежные вопросы