Вы должны ссылаться на полное ограничение PK, вы не можете просто ссылаться на один столбец, даже если вы делаете это для двух столбцов отдельно.
Вам нужно создать одиночный Ограничение FK, ссылающееся на на оба столбца :
CREATE TABLE Metal (
Mstuff VARCHAR(40) NOT NULL,
SubthingID INTEGER NOT NULL,
consists_of INTEGER NOT NULL,
foreign key (SubthingID, consists_of)
references subthing (SubthingID, consists_of) --<< ONE constraint with TWO columns
PRIMARY KEY (SubthingID, consists_of)
);
Когда вы запустите это, рано или поздно, вероятно, что left
будет на единицу меньше, чем right
- например, может быть left = 3
и right = 4
.
В этом случае (left - right) / 2
и (right - left) / 2
оба оцениваются как 0
, поскольку целочисленное деление округляется до нуля. Итак, если у вас есть
int mid = (left - right)/2 + right;
sort(array, helper, left, mid);
в вашем вызове на sort(array, helper, left, right)
, то вы повторяете вызов с точно такими же значениями. Это вызывает бесконечную рекурсию - StackOverflowError
.
Но когда у вас есть
int mid = left + (right - left)/2;
sort(array, helper, left, mid);
, вы повторяете вызов с другими значениями, поэтому рекурсия имеет шанс завершиться.