|
Создание Primary Key
|
|||
---|---|---|---|
#18+
Здравствуйте, прошу прощения за глупый вопрос. Столкнулась со следующей проблемой, как создать/ добавить в таблицу инкремируемый первичный ключ. Код пишется на C#. Используется провайдер "Provider=Microsoft.Jet.OLEDB.4.0; Работаю с файлами в формате DBF. string com = @"CREATE TABLE tablename(ID int IDENTITY(1,1), SName VARCHAR(225), CLIENTID int, visitTime date)"; Я так понимаю, выполнения этой строки достаточно, чтоб ID стал Primary Key. Пробовала еще такой вариант - string com2 = @"ALTER TABLE tablename ADD PRIMARY KEY (ID)"; При этом все запросы выполнялись без ошибок. Однако я легко могу вставить значение NULL в базу, ну и соответсвенно ничего не инкремировалось. т.е строка @"INSERT INTO tablename (SName) values (22)" просто добавляла в таблицу новую строку с пустым ID и значением 22 для SName. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2009, 21:29 |
|
Создание Primary Key
|
|||
---|---|---|---|
#18+
Вероника22, вот команда Create Table для Visual Foxpro 9, используемая в среде VFP9. Создает таблицу, с использованием указанных полей или массива. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Параметры CREATE TABLE | DBF TableName1 Создает таблицу или .dbf. Параметр TableName1 указывает имя таблицы. Опции TABLE и DBF идентичны. nCodePage Указывает кодовую страницу, которая будет использоваться для вновь создаваемой таблицы. Список поддерживаемых кодовых страниц вы можете посмотреть в описании Кодовые страницы, поддерживаемые Visual FoxPro. NAME LongTableName Указывает длинное имя для таблицы. Вы можете указать длинное имя для таблицы только в том случае, когда открыта база данных, поскольку длинные имена таблиц хранятся в базе данных. Длинные имена таблиц могут содержать до 128 символов в длину и могут быть использованы в базе данных вместо коротких имен. FREE Определяет, что таблица не будет ассоциирована с открытой базой данных. Если у вас нет открытой базы данных, то ключевое слово FREE можно не использовать. FieldName1, FieldType, nFieldWidth,nPrecision Указывает соответственно имя поля, тип поля, его длину и точность (число десятичных мест). Одиночная таблицы может содержать до 255 полей. Если одно или более полей позволяют использование null-значений, допустимое число полей снижается до 254. Параметр FieldType представляет собой одну букву или длинное имя, указывающее тип данных поля. Вы можете указать nFieldWidth, nPrecision или оба для некоторых типов полей. В приведенной ниже таблице перечислены значения для FieldType и указано, можете ли вы указать nFieldWidth и nPrecision. FieldType nFieldWidth nPrecision Data type W, Blob - - Blob C, Char, Character n – Поле Character длиной в n символов Y, Currency – – Currency D, Date – – Date T, DateTime – – DateTime B, Double – d Double G, General – – General I, Int, Integer – – Integer L, Logical – – Logical M, Memo – – Memo N, Num, Numeric n d Поле Numeric с длиной n и d десятичными местами F, Float n d Поле Numeric с плавающей запятой длиной n с d десятичными местами Q, Varbinary n - Поле Varbinary с длиной n V, Varchar n - Поле Varchar с длиной n Параметры nFieldWidth и nPrecision игнорируются для полей типов W, Y, D, T, G, I, L и M. Если nPrecision не указана для полей типов N или F, то параметр nPrecision по умолчанию устанавливается равным нулю (без десятичных мест). Если nPrecision не указана для поля типа B, то параметр nPrecision устанавливается по умолчанию в число десятичных мест, определенных установкой команды SET DECIMALS. NULL | NOT NULL Определяет - будут ли разрешены null-значения для хранения в поле. NULL разрешает хранение null-значений, а NOT NULL, соответственно, запрещает. Если одно или более полей могут хранить null-значения, максимальное число полей на таблицу ограничивается значением 254. CHECK lExpression1 Указывает правило проверки для поля. Параметр lExpression1 должен оцениваться в логическое выражение и может представляет собой пользовательскую функцию или хранимую процедуру. Visual FoxPro проверяет правило проверки, указанное в опции CHECK при добавлении пустой записи. ERROR cMessageText1 Указывает сообщение об ошибке. Visual FoxPro будет отображать это сообщение, когда правило проверки, указанное в опции CHECK будет генерировать ошибку. Сообщение отображается только тогда, когда данные изменяются в окне Browse или окне Edit. AUTOINC [NEXTVALUE NextValue [STEP StepValue]] Разрешает автоувеличение для поля. NextValue указывает начальное значение и может представлять, как положительное, так и отрицательное значение, лежащее в диапазоне от -2,147,483,647 до 2,147,483,647. Значением по умолчанию является единица (1). Вы можете установить значение NextValue, используя счетчик Next Value на закладке Fields дизайнера таблиц. StepValue указывает значение увеличения для поля и может быть положительным, ненулевым значением в диапазоне от 1 до 255. Значением по умолчанию является единица (1). Вы можете установить значение StepValue с помощью счетчика Step на закладке Fields дизайнера таблиц. Значения автоувеличения не могут быть NULL. NoteЗамечание Таблицы, содержащие поле с автоувеличением значения добавляют записи в буфферированные таблицы приблизительно на 35% медленне, чем в таблицы без таких полей, что может повлиять на производительность приложения. При использовании буфферизации таблицы, при добавлении записи заголовок таблицы блокируется. DEFAULT eExpression1 Указывает значение по умолчанию для поля, указанного в параметре FieldName1. Тип данных eExpression1 должен быть того же самого типа, что и тип поля. Если вы используете опцию AUTOINC, для включения возможности автоувеличения его значения, и указываете значение по умолчанию, Visual FoxPro будет хранить указанное вами значение по умолчанию, но не будет его использовать. Visual FoxPro будет использовать значение по умолчанию, если вы с помощью команды SQL ALTER TABLE снимите с поля возможность автоувеличения значений. PRIMARY KEY | UNIQUE PRIMARY KEY создает первичный индекс для поля, указанного в FieldName1. UNIQUE создает индекс-кандидат для поля, указанного в FieldName1. Первичный индексный тэг или тэг индекса-кандидата имеют тоже самое имя, что и имя поля. Для получения более подробной информации о первичных индексах и индексах-кандидатах смотри описание Типы индексов Visual FoxPro. COLLATE cCollateSequence Указывает последовательность сопоставления, если она отличается от значения по умолчанию - MACHINE. Параметр cCollateSequence должен быть допустимой последовательностью сопоставления, поддерживаемой Visual FoxPro. NoteСовет Вы, кроме того, можете использовоть команду SET COLLATE до создания индекса. Для получения более подробной информации об установке последовательности сопоставления (collation sequence) смотрите описания Оптимизация международных приложений и Команда SET COLLATE. REFERENCES TableName2 [TAG TagName1] Указывает родительскую таблицу, с которой устанавливается постоянное отношение (persistent relationship). Родительская таблицы не может быть свободной таблицей. Параметр TagName1 определяет имя тэга для родительской таблицы, указанной в TableName2. Имена индексных тэгов могут иметь длину до 10 символов. Если вы опустите опцию TAG , то постоянное отношение устанавливается с использованием первичного индексного ключа родительской таблицы. Если родительская таблицы не имеет первичного индекса, то в таком случае Visual FoxPro сгенерирует ошибку. NOCPTRANS Предотвращает трансляцию в другую кодовую страницу для полей с типами Character, Memo и Varchar. Вы можете указать NOCPTRANS только для символьных и мемо полей. Это создает типы, которые появляются в виде Character (Binary), Memo (Binary) и Varchar (Binary) в дизайнере таблиц. FieldName2 ... Указывает одно или более полей с соответствующими аттрибутами. PRIMARY KEY eExpression2 TAG TagName2 Указывает любое поле или комбинацию полей в таблице, которое будет использоваться в таблице для создания первичного индекса. Вы не можете использовать это ключевое слово - PRIMARY KEY, если ранее для поля уже был создан первичный индекс, поскольку таблица может иметь только один первичный индекс. Если вы включите более одной опции PRIMARY KEY в предложение CREATE TABLE, Visual FoxPro сгенерирует ошибку. Параметр TagName2 указывает имя для первичного индексного тэга в выражении eExpression2. Имена индексных тэгов могут иметь длину до 10 символов. UNIQUE eExpression3 TAG TagName3 Указывает любое поле или комбинацию полей в таблице, которое/которые будет использоваться в таблице для создания индекса-кандидата. Таблица может иметь множество индексов-кандидатов. Однако, если вы ранее создали первичный ключ с опцией PRIMARY KEY, вы не можете включить в комбинацию, используемую для создания индекса-кандидата, поле, указанное для первичного индекса. Параметр TagName3 указывает имя для тэга индекса-кандидата в eExpression3. Имена индексных тэгов могут иметь длину до 10 символов. FOREIGN KEY eExpression4 TAG TagName4 [ NODUP ] Создает внешний (foreign (non-primary)) индекс, указанного выражения индексного ключа, и установливает отношение к родительской таблице. Вы можете создать множество внешних ключей для таблицы, но выражение внешнего индексного ключа, в таком случае, должно указывать разные поля в таблице. Параметр TagName4 указывает имя для тэга внешнего индексного ключа. Имена индексных тэгов могут иметь длину до 10 символов. NODUP создает внешний инедкс-кандидат. REFERENCES TableName3 TAG TagName5 Указываеть родительскую таблицу, с которой устанавливается постоянное отношение. Параметр TagName5 указывает имя индексного тэга для родителской таблицы в TableName3 и устанавливает отношение, основанное на индексном тэге. Имена индексных тэгов могут иметь длину до 10 символов. Если вы опустите опцию TAG, отношение устанавливается, по умолчанию, с использованием первичного индексного ключа родительской таблицы. CHECK lExpression2 Указывает правило проверки для таблицы. Параметр lExpression2 должен оцениваться в логическое выражение и может представлять собой пользовательскую функцию или хранимую процедуру. ERROR cMessageText2 Указывает сообщение об ошибке для правила проверки таблицы в lExpression2. Visual FoxPro будет отображать это сообщение, когда правило проверки сгенерирует ошибку. Сообщение отображается только при изменении данных внутри окна Browse или окна Edit. FROM ARRAY ArrayName Указывает имя существующего массива, содержание которого составляют имя, тип, точность и диапазон для каждого поля в таблице. Вы можете использовать опцию FROM ARRAY вместо указания индвидуальных полей в предложении SQL CREATE TABLE. Для просмотра соответствующиего формата массива обратитесь к описанию функции AFIELDS(). Автоувеличение значений поля включается при указании значения StepValue большего, чем 0. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2009, 22:02 |
|
Создание Primary Key
|
|||
---|---|---|---|
#18+
Вероника22Используется провайдер "Provider=Microsoft.Jet.OLEDB.4.0; Работаю с файлами в формате DBF. Вот это и плохо. Сей провайдер достаточно старый и про новшества 9-й версии фокса не знает. Надо использовать VFP OLEDB Provider? лежащий на сайте мелкомягких string com = @"CREATE TABLE tablename(ID int IDENTITY(1,1), SName VARCHAR(225), CLIENTID int, visitTime date)"; Я так понимаю, выполнения этой строки достаточно, чтоб ID стал Primary Key. И можно узнать на каком основании? Первичный ключ вроде бы всегда надо было указывать явно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2009, 22:26 |
|
Создание Primary Key
|
|||
---|---|---|---|
#18+
Sergey Sizov., Это я написал про 9-ю версию фокса. Что у автора, неизвестно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2009, 00:26 |
|
Создание Primary Key
|
|||
---|---|---|---|
#18+
1. В таблицах FoxPro вместо синтаксиса "ID int IDENTITY(1,1)" используется синтаксис "ID int AUTOINC". Однако данный тип поля был введен только в версии Visual FoxPro 8. Поэтому старые драйверы вроде "Microsoft.Jet.OLEDB.4.0" или ODBC for FoxPro такой тип данных не поддерживают. Следует использовать новый VFP OLEDB Provider. 2. Primary Key для свободных таблиц не может быть создан вообще. Он существует только для таблиц, включенных в контейнер базы данных. Для свободных таблиц создается "обычный" индекс типа Candidad стандартной командой INDEX ON ... 3. Если цель создания Primary Key - это организация связи между таблицами, то не стоит этого делать. Для FoxPro смысл Primary Key заключается в удобстве разработки приложения. Для целей ограничения по уникальности проще использовать индекс Candidad. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.01.2009, 23:16 |
|
Создание Primary Key
|
|||
---|---|---|---|
#18+
Спасибо. Действитлеьно проблема было в устаревшем драйвере. Скачала и поставила провайдер vfp 9, теперь автоинкремирование работает. Но не получается уставновить взаимосвязь между таблицами. Я так понимаю, нужно использовать синтаксис reference. Вторая команда выдает ошибку. string comtext3 = @"CREATE TABLE tablename(ID int not null autoinc UNIQUE, SName VARCHAR(225))"; string comtext4 = "CREATE TABLE table22(ID int not null autoinc UNIQUE, SName VARCHAR(225), CLIENTID int REFERENCES tablename TAG ID, visitTime date)"; Вторая команда выдает ошибку - Feature is not supported for non-.DBC tables. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2009, 16:17 |
|
Создание Primary Key
|
|||
---|---|---|---|
#18+
Вероника22 string comtext3 = @"CREATE TABLE tablename(ID int not null autoinc UNIQUE, SName VARCHAR(225))"; string comtext4 = "CREATE TABLE table22(ID int not null autoinc UNIQUE, SName VARCHAR(225), CLIENTID int REFERENCES tablename TAG ID, visitTime date)"; Вторая команда выдает ошибку - Feature is not supported for non-.DBC tables. Вы создаете таблицы не в контексте базы данных, а как свободные - надо сначала создать БД (create database путь\имя.dbc) и в ней создавать таблицы. Об этом говорит ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2009, 16:30 |
|
Создание Primary Key
|
|||
---|---|---|---|
#18+
Вероника22, Вы можете сформулировать зачем вам надо создавать связи между таблицами? Какая в этом необходимость? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2009, 16:37 |
|
Создание Primary Key
|
|||
---|---|---|---|
#18+
ВладимирМВероника22, Вы можете сформулировать зачем вам надо создавать связи между таблицами? Какая в этом необходимость? Я хотела бы получить каскадное удаление или другие опции, например как в оракле column1 varchar2(100) references tablePARENT(parent_column) ON DELETE CASCADE column1 varchar2(100) references tablePARENT(parent_column) ON DELETE SET NULL. В идеале для моих целей подошел бы другой провайдер, но мне нужен был самый легкий и быстроустанавливаемый провайдер. Просто что-то не удается найти документации по командам foxpro. Много чего написано, а про синтаксис не найти, видимо плохо ищу. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2009, 15:29 |
|
Создание Primary Key
|
|||
---|---|---|---|
#18+
Вероника22! Я вам дал ссылку на документацию 3 дня назад. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2009, 15:36 |
|
Создание Primary Key
|
|||
---|---|---|---|
#18+
Вероника22ВладимирМВероника22, Вы можете сформулировать зачем вам надо создавать связи между таблицами? Какая в этом необходимость? Я хотела бы получить каскадное удаление или другие опции, например как в оракле column1 varchar2(100) references tablePARENT(parent_column) ON DELETE CASCADE column1 varchar2(100) references tablePARENT(parent_column) ON DELETE SET NULL. В идеале для моих целей подошел бы другой провайдер, но мне нужен был самый легкий и быстроустанавливаемый провайдер. Просто что-то не удается найти документации по командам foxpro. Много чего написано, а про синтаксис не найти, видимо плохо ищу. Таким способом не получится. Не пытайтесь. База данных FoxPro не то же самое, что промышленные СУБД вроде ORACLE или MS SQL. FoxPro по сравнению с промышленными СУБД - это как машинные коды по сравнению с высокоуровневыми языками программирования. В том смысле, что в ней нет готовых функций по поддержанию ссылочной целостности базы данных. Когда вы говорите о каскадном удалении, то применительно к промышленным СУБД подразумевается, что внутри этой СУБД уже есть готовый код, который все это делает. Надо только указать пару таблиц и некоторые дополнительные опции. Так вот, в FoxPro ничего этого НЕТ. Даже если вы укажете Primary и Foreign Key ни к чему это не приведет. После этого, все-равно надо будет СОЗДАТЬ (написать заново) некие процедуры, которые будут обеспечивать необходимую вам функциональность. В режиме разработки базы данных FoxPro (Design Time) для этой цели есть специальные утилиты "мастера". Эти утилиты, на основе выставленных Primary и Foreign Key автоматически создают такие процедуры и организуют их вызов как триггеров в соответствующих таблицах. Эти утилиты называются Referential Integrity. Однако, подчеркну еще раз, суть сводится к тому, что пишется некий программный код . Одних настроек, как в промышленной СУБД - недостаточно. А написать программный код через ODBC или OLE DB нельзя. Поэтому все ваши усилия в данном случае не имеют сысла. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2009, 16:41 |
|
|
start [/forum/topic.php?fid=41&msg=35767635&tid=1586859]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 157ms |
0 / 0 |