Понимание правил обновления и удаления для отношений в SSMS 2008

Возможно, что-то вроде этого:

#include <stdio.h>
#include <stdlib.h>

/* An arbitrary starting size. 
   Should be close to what you expect to use, but not really that important */
#define INIT_ARRAY_SIZE 8

int array_size = INIT_ARRAY_SIZE;
int array_index = 0;
array = malloc(array_size * sizeof(int));

void array_push(int value) {
  array[array_index] = value;
  array_index++;
  if(array_index >= array_size) {
    array_size *= 2;
    array = realloc(array, array_size * sizeof(int));
  }
}

int main(int argc, char *argv[]) {
  int shouldBreak = 0;
  int val;
  while (!shouldBreak) {
    scanf("%d", &val);
    shouldBreak = (val == 0);
    array_push(val);
  }
}

Это вызовет номера и сохранит их в массиве, как вы просили. Он будет завершен при передаче с заданным значением 0.

Вы создаете функцию доступа array_push для добавления в ваш массив, вы вызываете realloc из этой функции, когда вы пробегаете пробел. Каждый раз вы удваиваете количество выделенного пространства. В лучшем случае вы выделите вдвое больше необходимой вам памяти, в худшем случае вы будете называть realloc log n раз, где n - окончательный размер предполагаемого массива.

Вы также можете проверить наличие ошибки после вызова malloc и realloc. Я не сделал этого выше.

17
задан Étienne 16 October 2014 в 12:51
поделиться

4 ответа

Внешний ключ определяет отношения родитель-потомок между двумя таблицами. Первичный ключ в родительской таблице - это внешний ключ в строках дочерней таблицы (до n).

Теперь, если этот первичный ключ в родительской таблице получает UPDATE, срабатывает ПРАВИЛО ОБНОВЛЕНИЯ. Либо все дочерние строки также обновляются, либо установлен в NULL или что-то еще. Однако лучше всего иметь первичный ключ, который НИКОГДА не меняется (фиксированный идентификатор или что-то в этом роде), так что это менее важное правило.

Более важным является правило УДАЛИТЬ - что, если родительская строка удалена (например, Порядок удаляется)? Вы также можете удалить все дочерние строки (все элементы строки заказа) с помощью CASCADE DELETE, или вы можете установить для их внешнего ключа значение NULL (у них больше нет родителя) - это полностью зависит от вашего конкретного сценария.

В сценарии заказа / строки заказа

26
ответ дан 30 November 2019 в 12:27
поделиться

Страница MSDN выглядит неплохим началом.

1
ответ дан 30 November 2019 в 12:27
поделиться

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

Если вы попытаетесь изменить значение внешнего ключа на что-то, не определенное первичным ключом, вы будете получить ошибку. Аналогичным образом, если вы попытаетесь изменить первичный ключ, который имеет зависимости внешнего ключа, вы получите сообщение об ошибке ... в качестве примера

Models table
modelID (primary key)   model
1                       Jeep   
2                       Ford

Customer table
id    customer   modelID (foreign key of Models.modelID)
1     1234       1
2     2345       2

Если вы попытаетесь удалить запись Jeep из Models, вы получите сообщение об ошибке, потому что у клиента 1234 установлен идентификатор модели к 1, и это если внешний ключ. Точно так же, если я попытаюсь обновить клиента 1234, чтобы он имел идентификатор модели 3, он выдаст ошибку, потому что в таблице моделей нет первичного ключа со значением 3

Проверьте это

1
ответ дан 30 November 2019 в 12:27
поделиться

Похоже, что документация находится в диалоговом окне отношений внешних ключей .

Кстати, справка F1 отлично работала у меня в SSMS 2008. Я сразу перешел на страницу выше (после того, как я искал Конечно же, полчаса онлайн).

3
ответ дан 30 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: