Aymane HATAFI Ответов: 3

Вставка нескольких строк для одного уникального ключа SQL server


Всем привет
Мне нужно вставить в таблицу более одной строки для одного и того же первичного ключа
моя таблица с именем счет-фактура
Столбцы счета-фактуры таблица ID счета,счета клиента,сотрудника(работника, которые работают для клиента)
поэтому я хочу вставить один счет например счет номер 1 есть один клиент но это клиент имеет более одного сотрудника на самом деле он может иметь более 20 сотрудников поэтому я попробовал код ниже

но это не работает.
я хочу, чтобы стол был таким же.
может ли кто-нибудь помочь мне с этим, пожалуйста.

сотрудник costumername idinvoice

4 thales_informatique Самир
4 thales_informatique Джон
4 thales_informatique наконец
4 thales_informatique Aymane

Надеюсь, вы меня понимаете.

Что я уже пробовал:

declare @costumename varchar(50)
set @costumename='thales_informatique'
while  @costumename='thales_informatique'
begin
insert into client values (4,'thales_informatique','Samir')
insert into client values (4,'thales_informatique','John')
insert into client values (4,'thales_informatique','nally')
insert into client values (4,'thales_informatique','Aymane')
break;
end

CHill60

Как вы определили свою клиентскую таблицу и какова ошибка, которая возникает при попытке запустить ваш код?

Aymane HATAFI

код exeuted успешно, но для каждого работника в костюмчике это даст уникальный идентификатор накладной например я хочу вставить один счет содержать один клиент и сотрудник 5 это вставить их в отдельных строках, а все строки с ID счета, который означает, что я буду иметь 5 счетов-фактур, кроме меня я хочу, чтобы все те, служащего в одном счете-фактуре

CHill60

Как вы определили свои таблицы? Это звучит так, как будто у вас есть столбец идентификаторов в таблице счетов-фактур. Это также звучит так, как будто ваш дизайн базы данных неисправен

Aymane HATAFI

Я объявляю Id voice в качестве первичного ключа с автоматическим приращением для моей базы данных я не думаю что в этом есть что то неправильное

Richard Deeming

NB: Если вы не работаете в магазине маскарадных костюмов, это "клиент", а не "костюмер". :)

Aymane HATAFI

это не мои большие проблемы на данный момент если только до тех пор пока программа не будет работать должным образом тогда я проверю грамматику но в любом случае спасибо за ваше время и хорошего вам отдыха

Aymane HATAFI

Спасибо всем вам за ваше время я действительно ценю его для вас
Желаю вам всего наилучшего

3 Ответов

Рейтинг:
23

ZurdoDev

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


Рейтинг:
20

Patrice T

Цитата:
Мне нужно вставить в таблицу более одной строки для одного и того же первичного ключа

А ты-нет! это принцип, первичный ключ уникален.
Вы можете иметь несколько строк с одним и тем же ключом, но этот ключ не будет основным.


Рейтинг:
0

CHill60

Другие решения сказали вам, что вы не можете сделать, вот решение, которое приведет вас к тому, что вы хотите видеть.

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

create table #customer
( custid int identity(1,1), custname nvarchar(50))

create table #employee
(empid int identity(1,1), custid int, empname nvarchar(50))

create table #invoice
(invid int identity(1,1), custid int, invdate date)
Теперь я помещу некоторые примеры данных в мои таблицы клиентов и сотрудников:
insert into #customer (custname) values ('thales_informatique'), ('another client')
insert into #employee (custid, empname) values
(1, 'Samir'), (1, 'John'), (1, 'nally'), (1, 'Aymane'),
(2, 'Sammy'), (2, 'Jayne'), (2, 'Sally'), (2, 'Mary'), (2, 'Joe'), (2, 'Ian')
А теперь несколько очень простых данных в мою таблицу счетов
insert into #invoice (custid, invdate) values
(1, getdate()), (1, getdate()), (2, getdate())
Итак, теперь у меня есть три счета-фактуры: 1, 2 и 3. но если я сейчас присоединюсь к другим моим таблицам, то смогу получить результаты, которые вам, похоже, нужны:
select i.invid, i.invdate, c.custid, c.custname, e.empname
from #invoice i
inner join #customer c on i.custid = c.custid
inner join #employee e on i.custid = e.custid
order by invid, empname
Результаты:
Invid   InvDate        CustId   CustName                EmpName
1	2018-03-02	1	thales_informatique	Aymane
1	2018-03-02	1	thales_informatique	John
1	2018-03-02	1	thales_informatique	nally
1	2018-03-02	1	thales_informatique	Samir
2	2018-03-02	1	thales_informatique	Aymane
2	2018-03-02	1	thales_informatique	John
2	2018-03-02	1	thales_informatique	nally
2	2018-03-02	1	thales_informatique	Samir
3	2018-03-02	2	another client	        Ian
3	2018-03-02	2	another client	        Jayne
3	2018-03-02	2	another client	        Joe
3	2018-03-02	2	another client	        Mary
3	2018-03-02	2	another client	        Sally
3	2018-03-02	2	another client	        Sammy
Теперь я получаю список всех сотрудников клиента для каждого счета. Вы можете вставить эти результаты в другую таблицу, если действительно хотите (но не должны), но вам придется иметь еще один "первичный ключ".

Но это не совсем полезный вопрос. Вы же не хотите перечислять каждого сотрудника для каждого счета. Обычно вы просто хотите знать, кто участвовал в этой продаже. Поэтому вам понадобится еще одна таблица, чтобы создать эту связь - какой сотрудник был вовлечен в какой счет и почему. Например
create table #empToinv
(invid int, empid int, emprole varchar(50))

insert into #empToinv (invid, empid, emprole) values
(1, 1, 'Salesman'), (1,4,'Supervisor'), (1,3, 'Picker'),
(2,2, 'Salesman'),
(3,10, 'Salesman'), (3,8,'Supervisor')
И измените запрос, чтобы использовать новую таблицу
select i.invid, i.invdate, c.custid, c.custname, e.empname
from #invoice i
inner join #empToinv T on i.invid = T.invid
inner join #customer c on i.custid = c.custid
inner join #employee e on T.empid = e.empid
order by invid, empname
Результаты:
Invid   InvDate        CustId   CustName                EmpName
1	2018-03-02	1	thales_informatique	Aymane
1	2018-03-02	1	thales_informatique	nally
1	2018-03-02	1	thales_informatique	Samir
2	2018-03-02	1	thales_informatique	John
3	2018-03-02	2	another client	        Ian
3	2018-03-02	2	another client	        Mary