【问题标题】:Two identical inserts but for different tables - one works one doesn't两个相同的插入,但用于不同的表 - 一个有效,一个无效
【发布时间】:2021-06-15 15:45:21
【问题描述】:

我有两张桌子;

表一

CREATE TABLE Player_Match_Stats_Tackles (
    Fixture       INTEGER REFERENCES Fixture (ID),
    Player        INTEGER REFERENCES Player,
    Successful    INTEGER,
    Attempted     INTEGER,
    Was_Dribbled  INTEGER,
    Clearances    INTEGER,
    Interceptions INTEGER,
    Complete      BOOLEAN DEFAULT FALSE,
    PRIMARY KEY (
        Fixture,
        Player
    )
);

还有表二

CREATE TABLE Player_Ratings (
    Fixture  INTEGER NOT NULL
                     UNIQUE,
    Player   INTEGER,
    Rating   INTEGER,
    Source   TEXT,
    Complete BOOLEAN NOT NULL
                     DEFAULT FALSE,
    FOREIGN KEY (
        Player
    )
    REFERENCES Player
);

我有以下代码可以完美运行;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player1
FROM LineUp
WHERE LineUp.Player1 IS NOT NULL;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player2
FROM LineUp
WHERE LineUp.Player2 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player3
FROM LineUp
WHERE LineUp.Player3 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player4
FROM LineUp
WHERE LineUp.Player4 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player5
FROM LineUp
WHERE LineUp.Player5 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player6
FROM LineUp
WHERE LineUp.Player6 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player7
FROM LineUp
WHERE LineUp.Player7 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player8
FROM LineUp
WHERE LineUp.Player8 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player9
FROM LineUp
WHERE LineUp.Player9 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player10
FROM LineUp
WHERE LineUp.Player10 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player11
FROM LineUp
WHERE LineUp.Player11 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub1
FROM LineUp
WHERE LineUp.Sub1 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub2
FROM LineUp
WHERE LineUp.Sub2 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub3
FROM LineUp
WHERE LineUp.Sub3 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub4
FROM LineUp
WHERE LineUp.Sub4 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub5
FROM LineUp
WHERE LineUp.Sub5 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub6
FROM LineUp
WHERE LineUp.Sub6 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Match_Stats_Tackles (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub7
FROM LineUp
WHERE LineUp.Sub7 IS NOT NULL;

然后我再次使用相同的代码,但使用 Player_Ratings

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player1
FROM LineUp
WHERE LineUp.Player1 IS NOT NULL;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player2
FROM LineUp
WHERE LineUp.Player2 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player3
FROM LineUp
WHERE LineUp.Player3 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player4
FROM LineUp
WHERE LineUp.Player4 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player5
FROM LineUp
WHERE LineUp.Player5 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player6
FROM LineUp
WHERE LineUp.Player6 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player7
FROM LineUp
WHERE LineUp.Player7 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player8
FROM LineUp
WHERE LineUp.Player8 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player9
FROM LineUp
WHERE LineUp.Player9 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player10
FROM LineUp
WHERE LineUp.Player10 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Player11
FROM LineUp
WHERE LineUp.Player11 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub1
FROM LineUp
WHERE LineUp.Sub1 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub2
FROM LineUp
WHERE LineUp.Sub2 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub3
FROM LineUp
WHERE LineUp.Sub3 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub4
FROM LineUp
WHERE LineUp.Sub4 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub5
FROM LineUp
WHERE LineUp.Sub5 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub6
FROM LineUp
WHERE LineUp.Sub6 IS NOT NULL;

;

INSERT OR IGNORE INTO Player_Ratings (
Fixture,
Player
)
SELECT LineUp.Fixture,
LineUp.Sub7
FROM LineUp
WHERE LineUp.Sub7 IS NOT NULL;

;

第二个代码在第一次插入之后停止,只添加了几行(应该是 c.180 时是 10 行)。

我做错了什么。第一个可以正常工作的代码也可以在其他 6 个表上正常工作,只需更改表名即可。

我已经在谷歌上搜索并使用我的 SQL 书好几个小时了,但我无法理解它。

谢谢

【问题讨论】:

    标签: sqlite sql-insert


    【解决方案1】:

    想通了。表 2 中的 Fixture 有一个唯一约束,我没有发现它应该是 Player 的复合键

    【讨论】:

      猜你喜欢
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 2019-11-22
      相关资源
      最近更新 更多