auto_increment是否未设置主键的值?

时间:2019-01-27 05:22:07

标签: mysql sql perl

当我使用终端(mysql)并将其插入usernameaccount_password列时,我感到困惑,就像应该的那样,将user_id AUTO_INCREMENTS插入。

我的桌子:

        CREATE TABLE users (
  user_id int NOT NULL  AUTO_INCREMENT,
  user_type VARCHAR(20) NULL,
  creation_date TIMESTAMP NOT NULL,
  username VARCHAR(100) NOT  NULL,
  account_password VARCHAR(255) NOT NULL,
  PRIMARY KEY (user_id)
);

当我使用此脚本时:

use strict;
use warnings FATAL => 'all';# good for debugging, FATAL kills program so warnings are more identifiable
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser); # good for debugging, sends info to browser
use DBI;
use DBD::mysql;
use Digest::SHA qw(sha256);

print header, start_html;
my $fName    = param('firstName');
my $lName    = param('lastName');
my $compName = param('compName');
my $email    = param('email');
my $pswrd    = param('password');
my $cnfPswrd = param('confPassword');
my $encpswrd = "";

#check passwords match, if not display error, and exit script
if ($pswrd eq $cnfPswrd) {
    $encpswrd = sha256($pswrd);
} else {
    print "Passwords did not match! refresh form!";
    exit;
}

#database credentials, to be changed accordingly
my $database = "intsystest";
my $host     = "localhost";
my $user     = "root";
my $pw       = "password";
my $dsn      = "dbi:mysql:$database:localhost:3306";

#connect to database
my $dbh      = DBI->connect($dsn, $user, $pw,
                           { RaiseError => 1 }) or die "unable to connect:$DBI::errstr\n"; # <- this line good for debugging

#create, prepare, execute query, disconnect from DB
my $personsQuery = "INSERT INTO persons (first_name, last_name) VALUES (?,?)";
my $compQuery    = "INSERT INTO company (company_name) VALUES (?)";
my $usersQuery   = "INSERT INTO users (username, account_password) VALUES (?,?)";

my $sth   = $dbh->prepare($personsQuery); 
$sth->execute($fName, $lName);
$sth      = $dbh->prepare($compQuery);
$sth->execute($compName);
$sth      = $dbh->prepare($usersQuery);
$sth->execute($email, $encpswrd);
$dbh -> disconnect;

# additional processing as needed ...

print end_html;

我收到此错误:

 DBD::mysql::st execute failed: Field 'user_id' doesn't have a default value at /usr/lib/cgi-bin/compSignUpDBCGI.pl line 44.

我假设处理程序可能有问题。我想念什么?

1 个答案:

答案 0 :(得分:1)

如果您的persons表具有users表的外键,则需要先插入users记录,然后获取新users记录的ID,然后将其添加到SQL中以插入persons记录。

类似这样的东西:

my $usersQuery   = "INSERT INTO users (username, account_password) VALUES (?,?)";
$sth      = $dbh->prepare($usersQuery);
$sth->execute($email, $encpswrd);

$sth = $dbh->prepare('SELECT user_id FROM users WHERE username = ?');
$sth->execute($email);
my $user_id = $sth->fetch->[0];

my $personsQuery = "INSERT INTO persons (user_id ,first_name, last_name) VALUES (?,?,?)";
$sth   = $dbh->prepare($personsQuery); 
$sth->execute($user_id, $fName, $lName);

DBIx::Class绝对可以使您的生活更轻松。