Я хочу написать триггер для обновления вставки и удаления я одну таблицу с именем (tbl_rank), которые имеют первичный ключ (ID)
Пожалуйста, напишите DDL, чтобы люди не могли угадать, какие ключи, ограничения, декларативная ссылочная целостность, типы данных и т. Д. В вашей схеме. Узнайте, как следовать правилам именования элементов данных ISO-11179 и правилам форматирования. Временные данные должны использовать форматы ISO-8601. Код должен быть в стандартном SQL как можно больше, а не локальном диалекте.
Это минимальное поведение на форумах SQL. Помещение «tbl_» на имя таблицы - это классический дефект дизайна, называемый «tbling», а имена столбцов также являются нарушениями правил ISO-11179. Теперь мы должны угадать ключи, типы данных и т. Д. Вот моя догадка и уборка.
CREATE TABLE Prizes
(prize_id INTEGER NOT NULL PRIMARY KEY,
prize_name CHAR(1) NOT NULL,
prize_rank INTEGER NOT NULL);
INSERT INTO Prizes
VALUES
(1, 'A', 1),
(2, 'B', 2),
(3, 'C', 3),
(4, 'D', 4),
(5, 'E', 5);
Почему триггеры? RDBMS имеет виртуальные таблицы и столбцы. Это не колода перфокарт или магнитная лента. VIEW всегда актуальный и правильный.
CREATE VIEW Prize_List
AS
SELECT prize_id, prize_name,
ROW_NUMBER() OVER (ORDER BY prize_id)
AS prize_rank
FROM Prizes;
Но было бы лучше, чтобы полностью отказаться от prize_id колонки и переставить порядок отображения на основе prize_rank колонки:
CREATE TABLE Prizes
(prize_name CHAR(1) NOT NULL,
prize_rank INTEGER NOT NULL PRIMARY KEY);
Теперь использовать процедуры для работы с таблицей по мере необходимости.
CREATE PROCEDURE Swap_Prize_Ranks (@old_prize_rank INTEGER, @new_prize_rank INTEGER)
AS
UPDATE Prizes
SET prize_rank
= CASE prize_rank
WHEN @old_prize_rank
THEN @new_prize_rank
ELSE prize_rank + SIGN(@old_prize_rank - @new_prize_rank)
END
WHERE prize_rank BETWEEN @old_prize_rank AND @new_prize_rank
OR prize_rank BETWEEN @new_prize_rank AND @old_prize_rank;
Если вы хотите сбросить несколько строк, не забудьте закрыть пробелы с этим:
CREATE PROCEDURE Close_Prize_Gaps()
AS
UPDATE Prizes
SET prize_rank
= (SELECT COUNT (P1.prize_rank)
FROM Prizes AS P1
WHERE P1.prize_rank <= Prizes.prize_rank);
Эй, никто не может мне помочь. пожалуйста, помогите мне –