Осуществите уникальные значения через две таблицы

Ключевое слово synchronized заставляет поток получать блокировку при вводе метода, так что только один поток может одновременно выполнить этот метод (для данного экземпляра объекта, если он не является статическим методом).

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

. Рассмотрим это:

 if (vector.isEmpty()){
     vector.add(data);
 }

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

Таким образом, вы также должны синхронизировать свой код приложения.

Поскольку синхронизация на уровне метода является a) дорогой, когда она вам не нужна, и b) недостаточно, когда вы теперь требуется синхронизация с синхронизацией (ArrayList в случае Vector).

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

14
задан nickf 3 January 2009 в 07:26
поделиться

6 ответов

Возможно, не прямой ответ на Ваш вопрос, но:

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

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

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

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

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

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

create table users1 (
    user_id integer primary key,
    username varchar(8) not null unique
);
create table users2 (
    user_id integer primary key,
    username varchar(8) not null unique
);
create table all_usernames (
    username varchar(8) primary key
);
create trigger users1_insert before insert on users1 for each row
    insert into all_usernames values(new.username);
create trigger users2_insert before insert on users2 for each row
    insert into all_usernames values(new.username);
create trigger users1_update before update on users1 for each row
    update all_usernames set username = new.username
    where username = old.username;
create trigger users2_update before update on users2 for each row
    update all_usernames set username = new.username
    where username = old.username;
create trigger users1_delete before delete on users1 for each row
    delete from all_usernames where username = old.username;
create trigger users2_delete before delete on users2 for each row
    delete from all_usernames where username = old.username;

можно затем заполнить таблицу с

insert into all_usernames select username from users1;
insert into all_usernames select username from users2;
1
ответ дан 1 December 2019 в 12:27
поделиться

Вы не можете объявить ограничение UNIQUE через несколько таблиц, и MySQL не поддерживает ограничения CHECK вообще. Но можно разработать триггер для поиска совпадающего значения в другой таблице. Вот является тест сценарием SQL:

DROP TABLE IF EXISTS foo;
CREATE TABLE FOO (username VARCHAR(10) NOT NULL);

DROP TABLE IF EXISTS bar;
CREATE TABLE BAR (username VARCHAR(10) NOT NULL);

DROP TRIGGER IF EXISTS unique_foo;
DROP TRIGGER IF EXISTS unique_bar;

DELIMITER //

CREATE TRIGGER unique_foo BEFORE INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE c INT;
  SELECT COUNT(*) INTO c FROM bar WHERE username = NEW.username;
  IF (c > 0) THEN
    -- abort insert, because foo.username should be NOT NULL
    SET NEW.username = NULL;
  END IF;
END//

CREATE TRIGGER unique_bar BEFORE INSERT ON bar
FOR EACH ROW BEGIN
  DECLARE c INT;
  SELECT COUNT(*) INTO c FROM foo WHERE username = NEW.username;
  IF (c > 0) THEN
    -- abort insert, because bar.username should be NOT NULL
    SET NEW.username = NULL;
  END IF;
END//

DELIMITER ;

INSERT INTO foo VALUES ('bill');  -- OK

INSERT INTO bar VALUES ('bill');  -- Column 'username' cannot be null

Вам также нужны подобные триггеры ON UPDATE для каждой таблицы, но Вам не должно быть нужно, любой включает, УДАЛЯЮТ.

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

Был бы, изменяя тип столбца ID быть доступным? Затем Вы могли пойти для GUID, которые будут уникальны через столько таблиц, сколько Вы хотите.

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

Я не знаю MySQL, но это - то, как можно сделать это в Oracle, и я полагаю, что MySQL действительно поддерживает осуществленные представления также.

Вы создаете осуществленное представление о тех двух таблицах. И Вы добавляете ограничение на уникальность данных на это представление.

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

-1
ответ дан 1 December 2019 в 12:27
поделиться
Другие вопросы по тегам:

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