Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Addenri
0 / 0 / 0
Регистрация: 09.04.2016
Сообщений: 21

Как избежать дублирования в составном ключе

20.05.2020, 22:23. Показов 566. Ответов 0

Студворк — интернет-сервис помощи студентам
Итак, есть БД (диаграма предлагается), сущности - Исполнители, Песни, Альбомы и СодержимоеАльбомов. Задание: "Для заданного исполнителя создать новый альбом «Лучшее», в который включить по четвертой части произведений из каждого его альбома. Вернуть количество треков в созданном альбоме."
Нагуглив курсоры и как их применять, решил так, пока без возврата параметра:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
CREATE PROCEDURE SelectBestOf
    @artist NCHAR(32),
    @new_id NUMERIC(18, 0),
    @COUNT INT output
AS
    BEGIN
        INSERT INTO Альбоми ([ID Альбому],[Назва альбома], [Виконавець])
        VALUES (@new_id, N'Краще', @artist)
 
        DECLARE @albums_amount INT
        SELECT @albums_amount = COUNT(*) FROM Альбоми WHERE [Виконавець] = @artist;
        
        DECLARE @current_album NUMERIC(18,0)
        DECLARE @current_song NUMERIC(18,0)
        DECLARE @album_size INT
        DECLARE cur CURSOR FOR
        SELECT [ID Альбому]
        FROM Альбоми
        WHERE Виконавець = @artist
 
        OPEN cur
        FETCH NEXT FROM cur INTO @current_album
        WHILE @@FETCH_STATUS = 0
        BEGIN
            SELECT @album_size = COUNT(*) FROM ВмістАльбомів WHERE [ID Альбому] = @current_album
                IF @album_size <> 0
                    BEGIN
                        DECLARE @quart INT
                        SET @quart = @album_size/4
 
                        DECLARE in_cur CURSOR FOR
                        SELECT TOP (@quart) [ID пісні]
                        FROM ВмістАльбомів
                        WHERE [ID Альбому] = @current_album
                        OPEN in_cur
                        FETCH NEXT FROM in_cur INTO @current_song
                        WHILE @@FETCH_STATUS = 0
                        BEGIN
                            INSERT INTO ВмістАльбомів ([ID пісні], [ID альбому])
                            VALUES(@current_song, @new_id)
                            FETCH NEXT FROM in_cur INTO @current_song
                        END
                        CLOSE in_cur
                        DEALLOCATE in_cur
                    END
            FETCH NEXT FROM cur INTO @current_album
        END
    CLOSE cur
    DEALLOCATE cur
    END
Громоздко, и видимо применять два курсора свосем плохо, НО записи создаются, только вот запрос выполняется с ошибками

Code
1
2
Msg 2627, Level 14, State 1, Procedure SelectBestOf, Line 7
Violation of PRIMARY KEY constraint 'PK_Альбоми'. Cannot insert duplicate key in object 'dbo.Альбоми'.
Code
1
2
Msg 2627, Level 14, State 1, Procedure SelectBestOf, Line 39
Violation of PRIMARY KEY constraint 'PK_ВмістАльбомів'. Cannot insert duplicate key in object 'dbo.ВмістАльбомів'.
Почему здесь происходит попытка вставить дубликат, если в целевой таблице составной ключ? И как убрать ошибки?
Миниатюры
Как избежать дублирования в составном ключе  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.05.2020, 22:23
Ответы с готовыми решениями:

Как избежать дублирования строк в запросе?
у меня стоит задача вывести из таблицы А те строки, вхождение которых по ID встречается в таблице Б пытался так: select * from tablea,...

Как избежать дублирования данных в текстовом поле при вставке в mysql таблицу
Как избежать дублирования данных в текстовом поле при вставке в mysql таблицу?? Помогите пожалуйста, разбираю вопросы на которые не...

Как избежать дублирования кода в Си
Допустим, есть такие структуры данных: enum Color{ Red, Blue, Black, White }; struct Car{ char*...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.05.2020, 22:23
Помогаю со студенческими работами здесь

Как избежать дублирования пользователей?
Как сделать, что бы при добавление в БД пользователи не повторялись Дополните код: MySqlCommand sqlCmd = new...

Как избежать дублирования сообщений ?
В гостевой книге или в форуме. Заполняешь форму отсылаешь, и вдруг взбрело в голову обновить страницу, и она вызыватся с теми же...

Как избежать дублирования кода?
Приветствую Вас уважаемые форумчане! Хочу обратиться к Вам за помощью. Возникли огромные пробелы в Java OOP , либо же я не до конца...

Как избежать дублирования записей?
Вопрос, наверное, совсем идиотский, но я новичок, уж простите. Создал в MS SQL таблицу Owners с двумя полями (*OwnerID, FIO). OwnerID...

Как избежать дублирования кода? Наследование
Здравствуйте. У меня следующая проблема: Есть несколько классов: A, B, C. Они наследуются от основного класса: BASE Есть по одному...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru