Tabelle ohne Spalte 'id' fortsetzen

71

Ich habe die folgende Sequelize-Definition einer Tabelle:

AcademyModule = sequelize.define('academy_module', {
        academy_id: DataTypes.INTEGER,
        module_id: DataTypes.INTEGER,
        module_module_type_id: DataTypes.INTEGER,
        sort_number: DataTypes.INTEGER,
        requirements_id: DataTypes.INTEGER
    }, {
        freezeTableName: true});

Wie Sie sehen, enthält iddiese Tabelle keine Spalte. Wenn ich jedoch versuche, es einzufügen, versucht es immer noch die folgende SQL:

 INSERT INTO `academy_module` (`id`,`academy_id`,`module_id`,`sort_number`) VALUES (DEFAULT,'3',5,1);

Wie kann ich die idFunktion deaktivieren, die es eindeutig hat?

Marc Rasmussen
quelle

Antworten:

110

Wenn Sie keine definieren, wird standardmäßig die primaryKeyFolge verwendet id.

Wenn Sie Ihre eigenen festlegen möchten, verwenden Sie einfach primaryKey: truefür Ihre Spalte.

AcademyModule = sequelize.define('academy_module', {
    academy_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
    },
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});
Ben Fortune
quelle
2
Was ist, wenn sowohl module_id als auch akademy_id ein primärer Schlüssel ist?
Marc Rasmussen
Eine Tabelle kann nur einen Primärschlüssel haben, es sei denn, Sie erstellen einen zusammengesetzten Primärschlüssel. Ich bin mir nicht sicher, ob Sequelize dies unterstützt.
Ben Fortune
16
Ignorieren Sie das oben Gesagte, Sequelize unterstützt dies. Fügen primaryKey: trueSie einfach die Spalten hinzu , die Sie als Primärschlüssel verwenden möchten.
Ben Fortune
6
Warum wird dies überhaupt als Antwort angesehen? Die Frage war sehr klar: "Wie kann ich die idFunktion deaktivieren, die sie eindeutig hat?" und diese Antwort versucht, sie mit "Wenn Sie möchten, können Sie den Namen des Primärschlüssels ändern" zu beantworten. Was??
Andreas
5
Gemäß der Konfiguration von sequelize kann definiert werden, welches der vorhandenen / definierten Felder das sein soll id(Sie können mehrere Felder als festlegen primaryKey: true). Wenn Sie nur keine ID auf Ihrem Tisch haben, können Sie es in der Dokumentation von sequelize legazy einfach mit Model.removeAttribute('id');und entfernen wird eine Tabelle (Modell) ohne Primärschlüssel haben.
Aaron C
34

Wenn Sie den Primärschlüssel für die Tabelle vollständig deaktivieren möchten, können Sie verwenden Model.removeAttribute. Seien Sie gewarnt, dass dies in Zukunft zu Problemen führen kann, da Sequelize ein ORM ist und Joins zusätzliche Einstellungen erfordern.

const AcademyModule = sequelize.define('academy_module', {
    academy_id: DataTypes.INTEGER,
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});
AcademyModule.removeAttribute('id');
Ben Fortune
quelle
1
Das heißt, es sei denn, Sie möchten einer Nicht-Primärschlüsselspalte mit einem eindeutigen Index beitreten
Andy
16

Für einen zusammengesetzten Primärschlüssel sollten Sie allen Spalten des Primärschlüssels "primaryKey: true" hinzufügen. Sequelize betrachtet solche Spalten als Teil eines zusammengesetzten Primärschlüssels.

gaurav
quelle
Wie lösche ich den Primärschlüssel mit sequelize-cli wie in diesem Sequelize-Modell: create --name MyUsera --attributes first_name: Integer: primaryKey: true, last_name: string, bio: text
Rizwan Patel
Das war im Jahr 2015 und ich kann nicht herausfinden, was los ist. Wie baue ich die Beziehungen mit einem zusammengesetzten Schlüssel auf?
Phil
14

Wenn Ihr Modell keine ID-Spalte hat, können Sie Model.removeAttribute ('id') verwenden. es loswerden.

Siehe http://docs.sequelizejs.com/en/latest/docs/legacy/

In Ihrem Fall wäre es also so

AcademyModule = sequelize.define('academy_module', {
    academy_id: DataTypes.INTEGER,
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});
AcademyModule.removeAttribute('id');

Hinweis: Sie scheinen eine Join-Tabelle zu erstellen. Betrachten Sie das Erstellen academy_id und module_id Primärschlüssel. Auf diese Weise kann derselbe Link nicht mehrmals angezeigt werden, und die Datenbank erstellt nicht umsonst eine versteckte ID-Spalte.

Andreas
quelle