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

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

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

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

Надо сделать так, чтобы в при заполнении таблицы заказ мы могли выбрать любое количество товаров, а не один.
По идее, это надо делать при помощи связи один ко многим. Но как это сделать - идей нет.
Помогите, пожалуйста. Надо изменить именно 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2017, 23:44
Ответы с готовыми решениями:

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

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

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

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

2
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
23.05.2017, 11:12 2
Лучший ответ Сообщение было отмечено 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  [ТС] 3
Спасибо Вам огромное. Это именно то, что мне нужно.
0
23.05.2017, 21:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2017, 21:10
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru