0

我正在尝试定义交错表,并且当我们具有父表主表和交错表外键的相同列名时它可以工作。我已经将我的数据库从 mysql 迁移到 spanner。所有表都将“id”作为主键列名。

请考虑以下示例:

CREATE TABLE Singers (
  Id   INT64 NOT NULL,
  FirstName  STRING(1024),
  LastName   STRING(1024),
  SingerInfo BYTES(MAX),
) PRIMARY KEY (Id);

CREATE TABLE Albums (
  SingerId     INT64 NOT NULL,
  Id      INT64 NOT NULL,
  AlbumTitle   STRING(MAX),
) PRIMARY KEY (SingerId, Id),
  INTERLEAVE IN PARENT Singers ON DELETE CASCADE;

这对我不起作用,因为父(歌手)表具有“id”作为主键列,子表具有“SingerId”作为外键。

4

3 回答 3

0

我能够使用 Google Cloud Console 创建表。

在这里您可以找到等效的 DDL:


CREATE TABLE Singers (
    Id INT64 NOT NULL,
    FirstName STRING(MAX),
    LastName STRING(MAX),
    SingerInfo STRING(MAX),
) PRIMARY KEY (Id)

CREATE TABLE Albums (
    Id INT64 NOT NULL,
    SingerId INT64 NOT NULL,
    AlbumeTitle STRING(MAX),
) PRIMARY KEY (Id, SingerId),
INTERLEAVE IN PARENT Singers ON DELETE CASCADE

似乎列的顺序很重要。

父项的主键应该是第一个,因为它是继承的。

##编辑

它在控制台 UI 上工作

在此处输入图像描述 在此处输入图像描述

于 2020-08-11T09:16:26.777 回答
0

只需切换专辑主键的顺序即可解决问题:

CREATE TABLE Albums (
    SingerId INT64 NOT NULL,
    Id INT64 NOT NULL,
    AlbumeTitle STRING(MAX),
) PRIMARY KEY (SingerId, Id),
INTERLEAVE IN PARENT Singers ON DELETE CASCADE

顺便说一句,如果您只需要通用外键关系,而不需要物理数据交错,您可能需要考虑 Cloud Spanner 中更通用的外键。您可以在此处参考文档:https ://cloud.google.com/spanner/docs/foreign-keys/overview

要使用通用外键而不是交错,专辑表将如下所示(您可以保持主键的旧顺序)

CREATE TABLE Albums (
    Id INT64 NOT NULL,
    SingerId INT64 NOT NULL,
    AlbumeTitle STRING(MAX),
    FOREIGN KEY (SingerId) REFERENCES Singers(SingerId),
) PRIMARY KEY (Id, SingerId)

缺点是您不能使用级联删除,因为通用外键尚不支持它。

于 2020-08-30T04:12:34.203 回答
0

是的,主键规范的顺序很重要。

进一步来说:

如果您将一个表声明为另一个表的子表,则父表的主键列必须是子表主键的前缀。这意味着如果父表的主键由 N 列组成,则其每个子表的主键也必须由相同的 N 列组成,以相同的顺序并从同一列开始。

参考:https ://cloud.google.com/spanner/docs/schema-and-data-model#primary_keys

于 2020-08-11T16:41:22.263 回答