Внешний ключ может быть первичным в sql - PullRequest
0 голосов
/ 24 апреля 2020

Я создаю приложение (под Laravel). В этом приложении хотят, чтобы пользователи могли поделиться своим текущим местоположением. Моя sql схема относительно проста: у меня есть таблица местоположений и пользователи.

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

Моя проблема заключается в следующем: я хотел бы вставить столбец в свою таблицу местоположений для каждого пользователя (и обновить высоту и долготу, если user_id уже есть) в таблице местоположений).

Это хороший вариант, чтобы сделать внешний ключ 'user_id', также первичным ключом в моей таблице местоположений? Цель состоит в том, чтобы использовать «INSERT OR UPATE» для обновления столбца, если идентификатор пользователя находится в таблице местоположений (чтобы избежать 1200000 строк в моей таблице).

1 Ответ

1 голос
/ 24 апреля 2020

для целевой вставки или обновления

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

CREATE TABLE `locations` (
    `id` BIGINT unsigned NOT NULL AUTO_INCREMENT,
    `user_id` BIGINT unsigned,
    `latitude` FLOAT(11.8),
    `longitude` FLOAT(11.8),
    UNIQUE KEY `locations_primary_key` (`id`) USING BTREE,
    UNIQUE KEY `locations_unique_01` (`user_id`,`latitude`,`longitude`) USING BTREE,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB;

В laravel вы можете использовать FirstOrNew или FirstOrCreate для вставки или обновления вашей записи. Любая помощь, которую вы можете получить в laravel документах здесь . Вот пример только для ориентации (сейчас я не могу проверить код):

$user_id = 1;
$location = App\Location::firstOrCreate(
    ['user_id' => $user_id],
    ['latitude' => 10.12345, 'longitude' => 9.876]
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...