Модераторы: Akina

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> значения строк ключевого столбца 
:(
    Опции темы
unc
Дата 6.1.2013, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.12.2010

Репутация: нет
Всего: нет



в таблице sql server 2008 express есть один столбец, который является ключевым.
нужно добавить неопределенн. кол-во строк.
каждой строке нужно добавить значение, на данный момент которое задать невозможно, т.к. 
эти значения будут вводиться постепенно.
я ввела 3 строки в конструкторе таблицы. и пыталась присвоить значения NULL в каждой строке.
null не дает присвоить т.к. столбец ключевой и не может иметь null значения.
тогда я присвоила 1строке значение default , но во 2 строке default уже не присваивается,
т.к. в одном столбце не м.б. повторных значений. также null default 'n/a' в 1 строке присваивается, а во 2 строке не присваивается.
какие значения мне нужно присвоить всем строкам ключевого столбца чтобы не возникало ошибок и 
когда значения в строках еще неизвестны?
PM MAIL   Вверх
DarkProg
Дата 6.1.2013, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



Цитата(unc @  6.1.2013,  01:38 Найти цитируемый пост)
какие значения мне нужно присвоить всем строкам ключевого столбца чтобы не возникало ошибок и 
когда значения в строках еще неизвестны? 

Ключевой столбец(столбцы, бывают составные ключи) должен(должны) содержать уникальные не пустые значения.
Ключ в таблице это всё равно что ключ от машины, ваш не подойдёт к соседской, а также без ключа свою машину тоже не открыть ;) И тыкаясь в замок ключом в 10 одинаковых машин можно однозначно найти свою, ну или ту от которой ключ в руках ;).

Если задача тупо набить пустых записей то можно написать, либо скрипт(что судя по всему вы не сможете пока), либо небольшую утильку в 10 строк, которая будет просто забивать ключевые поля значением счётчика цикла(когда ничего не остаётся и счётчик прокатывает). Ну или если записей десятка два, то просто пишите руками и всё.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Akina
Дата 6.1.2013, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Можно выработать некое правило, согласно которому некий диапазон возможных значений ключевого поля означает, что запись невалидна. Например, для integer это может быть over 2*10^9...
При необходимости добавления некоего количества неинициализированных записей - выполняем добавление, начиная с этого значения. При необходимости инициализации такой записи - меняем значение поля первой (или последней) из неактивных записей на действительное.
Из неудобств - во-первых, придётся всегда отсекать эти невалидные записи (это можно сделать соотв. представлением, например), во-вторых, возникнут определённые сложности с добавлением пакета пустых записей, если предыдущий пакет не выбран полностью (тут наиболее разумным будет имхо их полная зачистка и новая генерация суммарного количества - остаток плюс потребность).




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
unc
Дата 9.1.2013, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.12.2010

Репутация: нет
Всего: нет



Код

use tempdb;
go

create table dbo.MasterTable
(
 m_id int not null identity primary key,
 UniqueValue int null,
 UniqueKey as isnull(UniqueValue, -m_id) persisted,
 check (UniqueValue >= 0),
 unique (UniqueKey)
);
go

create table dbo.SlaveTable
(
 s_id int not null identity primary key,
 UniqueKey int not null references dbo.MasterTable (UniqueKey) on update cascade
);
go

declare @t table (m_id int, UniqueKey int);

insert into dbo.MasterTable
output
 inserted.m_id, inserted.UniqueKey into @t (m_id, UniqueKey)
default values;

insert into dbo.SlaveTable
 (UniqueKey)
 select
  UniqueKey
 from
  @t;
  
select * from dbo.MasterTable;
select * from dbo.SlaveTable;

update m
 set
  UniqueValue = 10
from
 @t t join
 dbo.MasterTable m on m.m_id = t.m_id;
  
select * from dbo.MasterTable;
select * from dbo.SlaveTable;
go
 
drop table dbo.SlaveTable, dbo.MasterTable;
go


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

Это сообщение отредактировал(а) Akina - 9.1.2013, 17:34
PM MAIL   Вверх
Akina
Дата 9.1.2013, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Модератор: используйте тег "Код".

Цитата(unc @  9.1.2013,  18:28 Найти цитируемый пост)
у меня есть вот такой пример

Отлично. Разбирайтесь в нём. Справка по языку и трассировка в студии - в помощь.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
unc
Дата 9.1.2013, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.12.2010

Репутация: нет
Всего: нет



я просила помощи, а не рекомендации разобраться в коде, что и так понятно
PM MAIL   Вверх
Akina
Дата 9.1.2013, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Нет, Вы просите дать Вам готовое решение.

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

А за готовыми решениями - добро пожаловать во фриланс.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
unc
Дата 9.1.2013, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.12.2010

Репутация: нет
Всего: нет



здесь никто не предложил готовое решение. а я спросила где в примере добавляются строки в каждую таблицу.
из примера видно что есть таблицы master и slave, каждая из которых имеет столбец кот представлен не ключевым а уникальным (с пом. unique).
не понятно где в каждую из этих таблиц добавляются строки и для чего 3-я таюлица @t table:

Код

declare @t table (m_id int, UniqueKey int);
insert into dbo.MasterTable
output
 inserted.m_id, inserted.UniqueKey into @t (m_id, UniqueKey)
default values;
insert into dbo.SlaveTable
 (UniqueKey)
 select
  UniqueKey
 from
  @t;


Это сообщение отредактировал(а) Akina - 9.1.2013, 19:59
PM MAIL   Вверх
Akina
Дата 9.1.2013, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Я же говорил:
Цитата(Akina @  9.1.2013,  18:36 Найти цитируемый пост)
трассировка в студии - в помощь

Под словом "студия" разумелось SQL Management Studio (или в предыдущих версиях - SQL Query Analyzer). Делали? После выполнения каждой команды - смотрели состояние таблиц и локальных переменных?
Заодно почитайте вот это, особенно обратите внимание на OUTPUT Clause.


M
Akina
Используйте тег "Код".


Это сообщение отредактировал(а) Akina - 9.1.2013, 20:05


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
unc
Дата 22.1.2013, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.12.2010

Репутация: нет
Всего: нет



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

это точное задание.
помогите найти ошибку

все выглядит так:

m_id    Ф.И.О. наследодателя    UniqueValue    UniqueKey    дата смерти    паспортные данные
1     NULL     10     10     NULL     NULL

n_id    Ф.И.О. наследодателя    UniqueKey    дата смерти    паспортные данные
1     NULL     NULL     NULL     NULL

Ф.И.О. наследодателя    дата смерти    паспортные данные
NULL     NULL     NULL
NULL     NULL     NULL

Ф.И.О. наследодателя    дата смерти    паспортные данные
NULL     NULL     NULL
NULL     NULL     NULL
NULL     NULL     NULL
NULL     NULL     NULL

1ые 2 таблицы - с ними все нормально. а 2 другие которые ФИО наследодателя - с ними что то не так. я хотела чтобы ФИО наследодателя, дате смерти и паспортным данным из m-id и n_id таблиц присваивались неизвестные 
значения default values. в итоге добавились 2 другие таблицы. в 1ой 2 строки, в другой 4 строки.
и нужно чтобы при вводе данных ФИО наследодателя, дате смерти и паспортным данным в m_id те же данные появлялись в n_id.

и еще Uniquekey и uniquevalue в 1 таблице должны быть равны 10?

(строк обработано: 1)

(строк обработано: 1)

(строк обработано: 1)

(строк обработано: 1)

(строк обработано: 1)

(строк обработано: 1)
Сообщение 2627, уровень 14, состояние 1, строка 5
Нарушение "UQ__Table_1__2DE46E933B2BBE9D" ограничения UNIQUE KEY. Невозможно вставить повторяющийся ключ в объект "dbo.Table_1".
Выполнение данной инструкции было прервано.
Сообщение 2627, уровень 14, состояние 1, строка 7
Нарушение "UQ__Table_1__2DE46E933B2BBE9D" ограничения UNIQUE KEY. Невозможно вставить повторяющийся ключ в объект "dbo.Table_1".
Выполнение данной инструкции было прервано.

(строк обработано: 2)

(строк обработано: 1)

(строк обработано: 1)

(строк обработано: 1)

(строк обработано: 4)


USE [notarius]
GO

/****** Object: Table [dbo].[Table_1] Script Date: 01/12/2013 13:42:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Table_1](
m_id int not null identity primary key,
[Ф.И.О. наследодателя] [char](50) NULL,
UniqueValue int null,
UniqueKey as isnull(UniqueValue, [Ф.И.О. наследодателя]) persisted,
check (UniqueValue >= 0),
unique (UniqueKey),
[дата смерти] [date] NULL,
[паспортные данные] [char](50) NULL);
GO

create table [dbo].[инф-ция о наследодателе_1]
(n_id int not null identity primary key,    
[Ф.И.О. наследодателя] [char](50) NULL,
UniqueKey int null references [dbo].[Table_1] (UniqueKey) on update cascade,
[дата смерти] [date] NULL,
[паспортные данные] [char](50) NULL);
go 

declare @t table (m_id int, UniqueKey int);

insert into [dbo].[Table_1] 
output
inserted.m_id, inserted.UniqueKey into @t (m_id, UniqueKey)
default values;

insert into [dbo].[инф-ция о наследодателе_1]
(UniqueKey)
select
UniqueKey
from
@t;

update m_id
set
UniqueValue = 10
from
@t t join
[dbo].[Table_1] m_id on m_id.m_id = t.m_id;

select * from [dbo].[Table_1];
select * from [dbo].[инф-ция о наследодателе_1];
go

insert into [dbo].[Table_1] ([Ф.И.О. наследодателя])
default values;
insert into [dbo].[Table_1] ([дата смерти])
default values;
insert into [dbo].[Table_1] ([паспортные данные])
default values;
go

SELECT [Ф.И.О. наследодателя],[дата смерти],[паспортные данные]
FROM [dbo].[Table_1];
go

insert into [dbo].[инф-ция о наследодателе_1] ([Ф.И.О. наследодателя])
default values;
insert into [dbo].[инф-ция о наследодателе_1] ([дата смерти])
default values;
insert into [dbo].[инф-ция о наследодателе_1] ([паспортные данные])
default values;
go

SELECT [Ф.И.О. наследодателя],[дата смерти],[паспортные данные]
FROM [dbo].[инф-ция о наследодателе_1];
go

drop table [dbo].[инф-ция о наследодателе_1], [dbo].[Table_1];
go
PM MAIL   Вверх
Zloxa (Online)
Дата 22.1.2013, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(unc @  22.1.2013,  15:52 Найти цитируемый пост)
помогите найти ошибку

Ошибки в строках 5 и 7
Цитата(unc @  22.1.2013,  15:52 Найти цитируемый пост)
это точное задание.

это лаба на триггеры?


Цитата(DarkProg @  6.1.2013,  02:41 Найти цитируемый пост)
Ключевой столбец(столбцы, бывают составные ключи) должен(должны) содержать уникальные не пустые значения.

Есть ли у МS понятие, что-то вроде отложенных ограничений целостности - ограничений которые проверяются не на  этапе модификации данных, а на этапе фиксации транзакций?
В оракле, знаю - есть. В PG тоже слышал, докручивали. А у MS с этим како?

Код

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 
Connected as zloxa@ORCL01
 
SQL> create table test_table(
  2     id number primary key deferrable initially deferred
  3     ,val number
  4  );
 
Table created
SQL> -- вставляем null в pk
SQL> insert into test_table(val) values (1);
 
1 row inserted
SQL> -- задваиваем значение pk
SQL> insert into test_table(id,val) values (2,2);
 
1 row inserted
SQL> insert into test_table(id,val) values (2,2);
 
1 row inserted
SQL> -- исправляем ситуацию
SQL> update test_table set id = 1 where id is null;
 
1 row updated
SQL> delete from test_table where val=2 and rownum =1;
 
1 row deleted
SQL> -- успешно фиксируемся
SQL> commit;
 
Commit complete
SQL> -- опять нарушаем ПК и фиксируемся не исправимшись
SQL> insert into test_table(val) values (1);
 
1 row inserted
SQL> commit;
 
commit
 
ORA-02091: transaction rolled back
ORA-01400: cannot insert NULL into (???)




Это сообщение отредактировал(а) Zloxa - 22.1.2013, 15:18


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
unc
Дата 22.1.2013, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.12.2010

Репутация: нет
Всего: нет



Сообщение 2627, уровень 14, состояние 1, строка 5
Нарушение "UQ__Table_1__2DE46E933B2BBE9D" ограничения UNIQUE KEY. Невозможно вставить повторяющийся ключ в объект "dbo.Table_1".
Выполнение данной инструкции было прервано.
Сообщение 2627, уровень 14, состояние 1, строка 7
Нарушение "UQ__Table_1__2DE46E933B2BBE9D" ограничения UNIQUE KEY. Невозможно вставить повторяющийся ключ в объект "dbo.Table_1".
Выполнение данной инструкции было прервано.

что значит как я определила есть ли ошибки?  вот сообщения.

в MS server нужно определять значения ключевых столбцов на этапе модификации данных,то есть до компиляции, иначе запрос не будет выполнен, если вы об этом.

нет это не лаба на триггеры.

есть мнение что я неправильна ввела имена всех столбцов таблицы, вот здесь:

insert into [dbo].[Table_1] ([Ф.И.О. наследодателя])
default values;
insert into [dbo].[Table_1] ([дата смерти])
default values;
insert into [dbo].[Table_1] ([паспортные данные])
default values;
go

SELECT [Ф.И.О. наследодателя],[дата смерти],[паспортные данные]
FROM [dbo].[Table_1];
go

insert into [dbo].[инф-ция о наследодателе_1] ([Ф.И.О. наследодателя])
default values;
insert into [dbo].[инф-ция о наследодателе_1] ([дата смерти])
default values;
insert into [dbo].[инф-ция о наследодателе_1] ([паспортные данные])
default values;
go

SELECT [Ф.И.О. наследодателя],[дата смерти],[паспортные данные]
FROM [dbo].[инф-ция о наследодателе_1];
go

что не надо добавлять имена столбцов. убрала и получилось вот что:
USE [notarius]
GO

/****** Object: Table [dbo].[Table_1] Script Date: 01/12/2013 13:42:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Table_1](
m_id int not null identity primary key,
[Ф.И.О. наследодателя] [char](50) NULL,
UniqueValue int null,
UniqueKey as isnull(UniqueValue, [Ф.И.О. наследодателя]) persisted,
check (UniqueValue >= 0),
unique (UniqueKey),
[дата смерти] [date] NULL,
[паспортные данные] [char](50) NULL);
GO

create table [dbo].[инф-ция о наследодателе_1]
(n_id int not null identity primary key,    
[Ф.И.О. наследодателя] [char](50) NULL,
UniqueKey int null references [dbo].[Table_1] (UniqueKey) on update cascade,
[дата смерти] [date] NULL,
[паспортные данные] [char](50) NULL);
go 

declare @t table (m_id int, UniqueKey int);

insert into [dbo].[Table_1] 
output
inserted.m_id, inserted.UniqueKey into @t (m_id, UniqueKey)
default values;

insert into [dbo].[инф-ция о наследодателе_1]
(UniqueKey)
select
UniqueKey
from
@t;

update m_id
set
UniqueValue = 10
from
@t t join
[dbo].[Table_1] m_id on m_id.m_id = t.m_id;

select * from [dbo].[Table_1];
select * from [dbo].[инф-ция о наследодателе_1];
go

insert into [dbo].[Table_1] 
default values;
go

insert into [dbo].[инф-ция о наследодателе_1] 
default values;
go

drop table [dbo].[инф-ция о наследодателе_1], [dbo].[Table_1];
go

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



PM MAIL   Вверх
unc
Дата 22.1.2013, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.12.2010

Репутация: нет
Всего: нет



по условию значения всех строк всех столбцах не известны, известен только тип значений. так как эти самые значения должны вводится
PM MAIL   Вверх
Zloxa (Online)
Дата 22.1.2013, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 10
Всего: 161



Цитата(unc @  22.1.2013,  16:49 Найти цитируемый пост)
нет это не лаба на триггеры.

Тогда причина извращености постановки задачи - не понятна. Можете пояснить откуда у задачи ноги растут? Описывайте цель, а не отдельный шаг


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
unc
Дата 22.1.2013, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 26.12.2010

Репутация: нет
Всего: нет



нужно создать 2 таблицы с одинаковым кол-вом столбцов и с одинаковыми названиями столбцов. 
при этом в каждый столбец этих таблиц должно добавляться n-строк. 
Значения строк не заданы, так как они будут появляться по мере ввода каждой строки. Известны только типы значений char date и char.

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

названия столбцов и типы значений строк показаны в примере.
Я думаю человек когда либо сталкив с sql serverом поймет.
понимаете сложно объяснять если вы не создавали таблицы в sql servere

Это сообщение отредактировал(а) unc - 23.1.2013, 10:47
PM MAIL   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1241 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.