Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
-3 / 2 / 4
Регистрация: 24.09.2015
Сообщений: 98

Связь один ко многим

22.05.2017, 23:44. Показов 4246. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Есть такая база данных:

Надо сделать так, чтобы в при заполнении таблицы заказ мы могли выбрать любое количество товаров, а не один.
По идее, это надо делать при помощи связи один ко многим. Но как это сделать - идей нет.
Помогите, пожалуйста. Надо изменить именно sql скрипт
Вот весь скрипт:
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
CREATE DATABASE Склад_1201    -- Вместо ХХХ подставьте свою комбинацию цифр
 ON PRIMARY                   -- Путь D:\Work\X7230XXX\ к файлам
   ( NAME = Склад_data,       -- базы данных уже должен существовать
     FILENAME = 'C:\Work\57230120клад_1201_data.mdf',
     SIZE = 5MB, 
     MAXSIZE = 75MB,
     FILEGROWTH = 3MB ),
 FILEGROUP Secondary
   ( NAME = Склад2_data,
     FILENAME = 'C:\Workклад_1201_data2.ndf',
     SIZE = 3MB, 
     MAXSIZE = 50MB,
     FILEGROWTH = 15% ),
   ( NAME = Склад3_data,
     FILENAME = 'C:\Workклад_1201_data3.ndf',
     SIZE = 4MB, 
     FILEGROWTH = 4MB )
 LOG ON
   ( NAME = Склад_log,
     FILENAME = 'C:\Workклад_1201_log.ldf',
     SIZE = 1MB,
     MAXSIZE = 10MB,
     FILEGROWTH = 20% ),
   ( NAME = Склад2_log,
     FILENAME = 'C:\Workклад_1201_log2.ldf',
     SIZE = 512KB,
     MAXSIZE = 15MB,
     FILEGROWTH = 10% )
 GO  
 USE Склад_1201
 GO
 CREATE RULE Logical_rule AS @VALUE IN ('Нет', 'Да')
 GO
 CREATE DEFAULT Logical_default AS 'Нет'
 GO
 EXEC sp_addtype Logical, 'char(3)', 'NOT NULL'
 GO
 EXEC sp_bindrule 'Logical_rule', 'Logical'
 GO
 EXEC sp_bindefault 'Logical_default', 'Logical'
 GO
  /* Регион */
 CREATE TABLE Регион (                /* первая команда пакета */
   КодРегиона INT  PRIMARY KEY,
   Страна     VARCHAR(20)  DEFAULT 'Беларусь'  NOT NULL,
   Область   VARCHAR(20)  NOT NULL,
   Город       VARCHAR(20)  NOT NULL,
   Адрес       VARCHAR(50)  NOT NULL,
   Телефон   CHAR(15)  NULL,
   Факс     CHAR(15)  NOT NULL  CONSTRAINT CIX_Регион2
     UNIQUE  ON Secondary,
   CONSTRAINT CIX_Регион  UNIQUE (Страна, Область, Город, Адрес)
     ON Secondary
 )
 
   /* Поставщик */
 CREATE TABLE Поставщик (          /* вторая команда пакета */
   КодПоставщика   INT  PRIMARY KEY,
   ИмяПоставщика   VARCHAR(40)  NOT NULL,
   УсловияОплаты   VARCHAR(30)  DEFAULT 'Предоплата'  NULL,
   КодРегиона     INT  NULL,
   Заметки       VARCHAR(MAX)  NULL,
   CONSTRAINT  FK_Поставщик_Регион  FOREIGN KEY (КодРегиона)
     REFERENCES  Регион  ON UPDATE CASCADE
 )
 
 
  /* Клиент */
 CREATE TABLE Клиент (                /* третья команда пакета */
   КодКлиента     INT  IDENTITY(1,1)  PRIMARY KEY,
   ИмяКлиента     VARCHAR(40)  NOT NULL,
   ФИОРуководителя   VARCHAR(60)  NULL,
   КодРегиона         INT  NULL,
   CONSTRAINT  FK_Клиент_Регион  FOREIGN KEY (КодРегиона)
     REFERENCES  Регион  ON UPDATE CASCADE
 )
 
  /* Валюта */
 CREATE TABLE Валюта (                /* четвертая команда пакета */
   КодВалюты       CHAR(3)  PRIMARY KEY,
   ИмяВалюты       VARCHAR(30)  NOT NULL,
   ШагОкругления   NUMERIC(10, 4)  DEFAULT 0.01  NULL
     CHECK (ШагОкругления IN (50, 1, 0.01)),
   КурсВалюты     SMALLMONEY  NOT NULL  CHECK (КурсВалюты > 0)
 )
 
  /* Товар */
 CREATE TABLE Товар (              /* пятая команда пакета */
   КодТовара       INT  PRIMARY KEY,
   Наименование VARCHAR(50)  NOT NULL,
   ЕдиницаИзм     CHAR(10)  DEFAULT 'штука'  NULL,
   Цена         MONEY  NULL  CHECK (Цена > 0),
   КодВалюты       CHAR(3)  DEFAULT 'BYR'  NULL,
   Расфасован     LOGICAL  NOT NULL,
   CONSTRAINT  FK_Товар_Валюта  FOREIGN KEY (КодВалюты)
     REFERENCES  Валюта  ON UPDATE CASCADE
 )
 
  /* Заказ */
 CREATE TABLE Заказ (              /* шестая команда пакета */
   КодЗаказа       INT  IDENTITY(1,1)  NOT NULL,
   КодКлиента     INT  NOT NULL,
   КодТовара       INT  NOT NULL,
   Количество     NUMERIC(12, 3)  NULL  CHECK (Количество > 0),
   ДатаЗаказа     DATETIME  DEFAULT getdate()  NULL,
   СрокПоставки DATETIME  DEFAULT getdate() + 14  NULL,
   КодПоставщика   INT  NULL,                      
   PRIMARY KEY (КодЗаказа, КодКлиента, КодТовара),
   CONSTRAINT  FK_Заказ_Товар  FOREIGN KEY (КодТовара)  
     REFERENCES  Товар  ON UPDATE CASCADE ON DELETE CASCADE,
   CONSTRAINT  FK_Заказ_Клиент  FOREIGN KEY (КодКлиента)
     REFERENCES  Клиент  ON UPDATE CASCADE ON DELETE CASCADE,
   CONSTRAINT  FK_Заказ_Поставщик  FOREIGN KEY (КодПоставщика)
     REFERENCES  Поставщик
 )
 GO
 CREATE UNIQUE INDEX  UIX_Поставщик  ON Поставщик (ИмяПоставщика)
   ON Secondary
 CREATE UNIQUE INDEX  UIX_Клиент  ON Клиент (ИмяКлиента)
   ON Secondary
 CREATE UNIQUE INDEX  UIX_Валюта  ON Валюта (ИмяВалюты)
   ON Secondary
 CREATE UNIQUE INDEX  UIX_Товар  ON Товар (Наименование)
   ON Secondary
 CREATE INDEX  IX_Регион  ON Регион (Страна, Город)  ON Secondary
 CREATE INDEX  IX_Товар  ON Товар (ЕдиницаИзм, Наименование)
   ON Secondary
 CREATE INDEX  IX_Заказ  ON Заказ (ДатаЗаказа)  ON Secondary
 GO
 INSERT INTO Регион 
 VALUES (101, 'Россия', 'Московская', 'Королев', 'ул.Мира, 15',
   '387-23-04', '387-23-05')
 
 INSERT INTO Регион (КодРегиона, Область, Город, Адрес, Факс)
 VALUES (201, '', 'Минск', 'ул.Гикало, 9', '278-83-88')    
 
 INSERT INTO Регион (КодРегиона, Область, Город, Адрес, Факс)
 VALUES (202, 'Минская', 'Воложин', 'ул.Серова, 11', '48-37-92')
 
 INSERT INTO Регион (КодРегиона, Область, Город, Адрес, Телефон,
   Факс)
 VALUES (203, '', 'Минск', 'ул.Кирова, 24', '269-13-76',
   '269-13-77') 
 
 INSERT INTO Регион (КодРегиона, Область, Город, Адрес, Факс)
 VALUES (204, 'Витебская', 'Полоцк', 'ул.Лесная, 6', '48-24-12')
 
 INSERT INTO Регион 
 VALUES (301, 'Украина', 'Крымская', 'Алушта', 'ул.Франко, 24',
   NULL, '46-49-16')    
 GO
 INSERT INTO Поставщик
 VALUES (123, 'ЗАО Магистраль', 'Предоплата', 101,
   NULL)
INSERT INTO Поставщик
 VALUES (234, 'ЗАО Алхимик', 'Предоплата', 101,
   NULL)
INSERT INTO Поставщик
 VALUES (345, 'ЗАО Шиномонтаж', 'Предоплата', 201,
   NULL)
INSERT INTO Поставщик
 VALUES (456, 'ЗАО Автомойка', 'Предоплата', 202,
   NULL)
INSERT INTO Поставщик
 VALUES (567, 'СП ”Полихим”', 'По факту отгрузки', 203,
   'Постоянный поставщик')   
 GO
INSERT INTO Клиент
 VALUES ('ГП ”Верас”', 'Прокушев Станислав Игоревич', 202)
INSERT INTO Клиент
 VALUES ('ГП ”Мираж”', 'Сидоров Иван Игоревич', 201)
INSERT INTO Клиент
 VALUES ('ГП ”Кураж”', 'Петров Петр Игоревич', 203)
INSERT INTO Клиент
 VALUES ('ГП ”Шестеренка”', 'Иванов Алексей Игоревич', 101)
INSERT INTO Клиент (ИмяКлиента, ФИОРуководителя)
 VALUES ('ИП ”Темп”', 'Васько Григорий Терентьевич')
 GO
INSERT INTO Валюта
 VALUES ('BYR', 'Белорусские рубли', 1, 1)
 
 INSERT INTO Валюта (КодВалюты, ИмяВалюты, КурсВалюты)
 VALUES ('RUR', 'Российские рубли', 276)
 
 INSERT INTO Валюта (КодВалюты, ИмяВалюты, КурсВалюты)
 VALUES ('USD', 'Доллары США', 9160)
 
 INSERT INTO Валюта (КодВалюты, ИмяВалюты, КурсВалюты)
 VALUES ('EUR', 'Евро', 12450)
 GO
INSERT INTO Товар
 VALUES (111, 'Монитор 21 дюйм', 'штука', 320, 'USD', 'Нет')
INSERT INTO Товар
 VALUES (222, 'Телевизор 32 дюйм', 'штука', 520, 'USD', 'Нет')
INSERT INTO Товар
 VALUES (333, 'Телефон 5 дюйм', 'штука', 220, 'USD', 'Нет')
INSERT INTO Товар
 VALUES (444, 'Планшет 10 дюйм', 'штука', 300, 'USD', 'Нет')  
 INSERT INTO Товар (КодТовара, Наименование, Цена, Расфасован)
 VALUES (555, 'Винчестер HDD 120GB', 285000, 'Да')
 GO
SET DATEFORMAT dmy      /* задаем привычный формат даты день.месяц.год, т.к. 
                                                   по умолчанию установлен формат год.месяц.день */
 INSERT INTO Заказ     /* год можно задавать как 2-мя, так и 4-мя цифрами */
 VALUES (3, 111, 8, '04.09.12', '14.09.12', 567)   
  INSERT INTO Заказ        /* год можно задавать как 2-мя, так и 4-мя цифрами */
 VALUES (3, 222, 8, '04.09.11', '14.09.11', 567)
 INSERT INTO Заказ     /* год можно задавать как 2-мя, так и 4-мя цифрами */
 VALUES (2, 333, 8, '04.09.14', '14.09.14', 345)
 INSERT INTO Заказ     /* год можно задавать как 2-мя, так и 4-мя цифрами */
 VALUES (2, 444, 8, '04.09.15', '14.09.15', 345)  
 INSERT INTO Заказ (КодКлиента, КодТовара, Количество)
 VALUES (1, 555, 25)
 GO
 CREATE VIEW Запрос1 AS
   SELECT TOP 100 PERCENT Товар.Наименование, Заказ.Количество, 
     Товар.ЕдиницаИзм, Поставщик.ИмяПоставщика
   FROM Заказ 
     INNER JOIN Поставщик 
       ON Заказ.КодПоставщика = Поставщик.КодПоставщика 
     INNER JOIN Товар 
       ON Заказ.КодТовара = Товар.КодТовара
   ORDER BY Товар.Наименование, Заказ.Количество DESC 
 GO
 EXEC sp_grantlogin 'DARKSHADOW\sql1'
 EXEC sp_grantlogin 'DARKSHADOW\sql2'
 EXEC sp_grantlogin 'DARKSHADOW\sql3'
 EXEC sp_grantlogin 'DARKSHADOW\sql4'
 GO
 EXEC sp_addsrvrolemember 'DARKSHADOW\sql1', 'dbcreator'  
 GO
 EXEC sp_grantdbaccess 'DARKSHADOW\sql1', 'sql1'  
 EXEC sp_grantdbaccess 'DARKSHADOW\sql2', 'sql2'  
 EXEC sp_grantdbaccess 'DARKSHADOW\sql3', 'sql3'    
 EXEC sp_grantdbaccess 'DARKSHADOW\sql4', 'sql4'  
 GO
 EXEC sp_addrole 'Гл.бухгалтер', 'sql1'  
 EXEC sp_addrole 'Бухгалтера',   'sql1'  
 EXEC sp_addrole 'Экономисты',   'sql1'  
 GO
 EXEC sp_addrolemember 'db_accessadmin', 'sql1'  
 EXEC sp_addrolemember 'Гл.бухгалтер',   'sql1'  
 EXEC sp_addrolemember 'Бухгалтера',     'sql2'  
 EXEC sp_addrolemember 'Бухгалтера',     'sql3'  
 EXEC sp_addrolemember 'Бухгалтера',     'Гл.бухгалтер'  
 EXEC sp_addrolemember 'Экономисты',     'sql4'  
 EXEC sp_addrolemember 'Экономисты',     'Гл.бухгалтер'  
 GO
 GRANT SELECT, INSERT, UPDATE, DELETE
 ON Валюта TO [Гл.бухгалтер] WITH GRANT OPTION
 
 GRANT UPDATE
 ON Заказ TO [Гл.бухгалтер] WITH GRANT OPTION
 
 GRANT SELECT
 ON Запрос1 TO [Гл.бухгалтер] WITH GRANT OPTION
 
 GRANT UPDATE, DELETE
 ON Клиент TO [Гл.бухгалтер] WITH GRANT OPTION
 
 GRANT UPDATE, DELETE
 ON Поставщик TO [Гл.бухгалтер] WITH GRANT OPTION
 
 GRANT UPDATE, DELETE
 ON Товар TO [Гл.бухгалтер] WITH GRANT OPTION
 
 GRANT SELECT, INSERT
 ON Заказ TO Бухгалтера
 
 GRANT SELECT, INSERT
 ON Клиент TO Бухгалтера
 
 GRANT SELECT, INSERT
 ON Поставщик TO Экономисты
 
 GRANT SELECT, INSERT
 ON Товар TO Экономисты
 
 GRANT SELECT, INSERT, UPDATE, DELETE
 ON Регион TO public
 GO
DENY UPDATE
 ON Заказ (ДатаЗаказа, СрокПоставки) TO [Гл.бухгалтер] CASCADE 
 GO
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.05.2017, 23:44
Ответы с готовыми решениями:

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

Связь Один ко Многим, если у родительской таблицы составной первичный ключ
Привет как реализовать связь 1 к N, если у родительской таблицы составной первичный ключ?

Связь многие-ко-многим
Здравствуйте! Какую ввести дополнительную сущность, чтобы избавиться от связи многие-ко-многим?

2
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
23.05.2017, 11:12
Лучший ответ Сообщение было отмечено TheTangro как решение

Решение

Цитата Сообщение от TheTangro Посмотреть сообщение
Помогите, пожалуйста. Надо изменить именно sql скрипт
ну меняй его, если так приятней.
а суть изменений такова: это
КодТовара INT NOT NULL,
Количество NUMERIC(12, 3) NULL CHECK (Количество > 0),

убирается из Заказа

и создается таблица

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
/*Состав заказа */
 CREATE TABLE СоставЗаказa (               /
   КодСоставaЗаказa        INT  IDENTITY(1,1)  NOT NULL,
   КодЗаказa INT  NOT NULL,
   КодТовара    INT  NOT NULL,
   Количество       NUMERIC(12, 3)  NULL  CHECK (Количество > 0),
                   
   PRIMARY KEY (КодСоставaЗаказa),
   CONSTRAINT  FK_Заказ_Товар  FOREIGN KEY (КодТовара)  
     REFERENCES  Товар  ON UPDATE CASCADE ON DELETE CASCADE,
   CONSTRAINT  FK_Заказ_Клиент  FOREIGN KEY (КодЗаказа)
     REFERENCES  Заказ ON UPDATE CASCADE ON DELETE CASCADE,
 )
ну или без КодСоставaЗаказa, с составным первичным ключом по (КодЗаказa, КодТовара)

да и тут
T-SQL
1
2
3
CREATE TABLE Заказ (               /* шестая команда пакета */
 ...                     
   PRIMARY KEY (КодЗаказа, КодКлиента, КодТовара),
достаточно ограничиться
T-SQL
1
  PRIMARY KEY (КодЗаказа),
1
-3 / 2 / 4
Регистрация: 24.09.2015
Сообщений: 98
23.05.2017, 21:10  [ТС]
Спасибо Вам огромное. Это именно то, что мне нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.05.2017, 21:10
Помогаю со студенческими работами здесь

Связь многое-ко-многим
Добрый день всем. Вопрос по связи многое-ко-многим: есть две таблички:Author и Article (у каждого автора может быть много статей и у каждой...

SQL и Связь многие ко многим
Здравствуйте гуру:Прошу помочь в написании запроса к следующим данным: есть 3-и таблицы связанные между собой ----------- 1)...

Связь многие ко многим... ошибка скрипта
доброго времени суток столкнулся с проблемой собсна вот код: // тут все ништяк таблицы книги и юзеры содержат грубо говоря название и...

Зачем нужны связи Один к Одному, Один ко Многим? Пример простой выборки
На этапе проектирования делаются связи один к одному один ко многим, откуда эти связи берутся понятно, непонятно как потом эти связи...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru