简体   繁体   English

设置外键

[英]setting foreign key

I was trying to set a foreign key so that I can associate the author of the photo to the username of users table , but I'm unable to create table. 我试图设置一个外键,以便可以将照片的作者与users表的用户名相关联,但是无法创建表。

UPDATE I got the unable to create table error resolved but the data still doesn't get in to the tables. 更新我解决了无法创建表的错误,但是数据仍然无法进入表。

CREATE TABLE IF NOT EXISTS `users` (
`username` varchar(30) NOT NULL ,
`password` varchar(40) default NULL,
`usersalt` varchar(8) NOT NULL,
`userid` varchar(32) default NULL,
`userlevel` tinyint(1) unsigned NOT NULL,
`email` varchar(50) default NULL,
`timestamp` int(11) unsigned NOT NULL,
`actkey` varchar(35) NOT NULL,
`ip` varchar(15) NOT NULL,
regdate` int(11) unsigned NOT NULL,
PRIMARY KEY  (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



CREATE TABLE IF NOT EXISTS photos (
ref int(10) unsigned NOT NULL auto_increment,
    photo varchar(75),
Firstname varchar(35),
    Lastname varchar(35),
    Age INT(3),
    author varchar(30) NOT NULL,
PRIMARY KEY (ref)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

here is what I tried to add FK after creating the table.. 这是我在创建表格后尝试添加FK的内容。

ALTER TABLE photos
ADD CONSTRAINT FK_photos
FOREIGN KEY (author) REFERENCES users(username)
ON UPDATE CASCADE
ON DELETE CASCADE;

here is the code to insert photo and some info along with it to database... 这是将照片和一些信息插入数据库的代码...

<?php
include("/include/session.php");
if(!$session->logged_in){ header("Location: ../main.php"); } else {
}
?>



<?php
$sub=0;

ini_set( "display_errors", 0);
if(isset($_REQUEST['submited'])) {
// your save code goes here

$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 2097152)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "";
if (file_exists("pictures/" . $_FILES["file"]["name"]))
{
echo "<font size='4' color='red'><b>We are sorry, the file you trying to upload already exists.</b></font>";
  }

else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"pictures/" . $_FILES["file"]["name"]);
$sub= 1;
$mysqli = new mysqli("localhost", "root", "", "secure_login");

// TODO - Check that connection was successful.

$photo= "pictures/" . $_FILES["file"]["name"];
$fname = $_POST["fname"];
$lname = $_POST["lname"];
$age   =$_POST["age"];
$stmt = $mysqli->prepare("INSERT INTO photos (photo, Firstname, Lastname, Age) VALUES (?, ?, ?, ?)");

// TODO check that $stmt creation succeeded

// "s" means the database expects a string
$stmt->bind_param("ssss", $photo, $fname, $lname, $age);

$stmt->execute();

$stmt->close();

$mysqli->close();



echo "<font size='7' color='white'><b> Success! Your item has been listed.</b></font>";
echo '<meta http-equiv="refresh" content="2;url=home.php">';
}

}
}
else
{
echo "<font size='4' color='red'><b>We are sorry, the file you trying to upload is not an image or it exceeds 2MB in size.</b></font><br><font color='blue'><i>Only images under size of 2MB are allowed</i></font>.";
}
}


?>

<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="submited" value="true" />


<?php
ini_set( "display_errors", 0);
if($sub==0)
{
?> 
<label  for="file"><font  size="5"><b>Choose Photo:</b></font></label>
<input id="shiny" type="file" name="file" onchange="file_selected = true;" required><br>
Last Name:<input  type="text" name="fname" value="<?php echo (isset($_POST['fname']) ? htmlspecialchars($_POST['fname']) : ''); ?>"required><br> 
Last Name:<input  type="text" name="lname" required><br> 
Age:<input type="text" name="age" required><br>
<input id="shiny" type="submit" value="Submit" name="submit">
<?php
}
?>


</form>
</div>

Do yourself a big favor and use an Integer as an ID field on all your tables and use that as your primary key field. 帮自己一个忙,在所有表上将Integer用作ID字段,并将其用作主键字段。 Then have all of your foreign key constraints reference that. 然后,让您的所有外键约束都参考该约束。 See the first example in the MySQL docs here: http://dev.mysql.com/doc/refman/5.5/en/example-foreign-keys.html 请参阅此处的MySQL文档中的第一个示例: http : //dev.mysql.com/doc/refman/5.5/en/example-foreign-keys.html

Plus, post your error message and I'll update my answer. 另外,发布您的错误消息,我将更新我的答案。

CREATE TABLE IF NOT EXISTS users ( username varchar(30) NOT NULL , password varchar(40) default NULL, usersalt varchar(8) NOT NULL, userid varchar(32) default NULL, userlevel tinyint(1) unsigned NOT NULL, email varchar(50) default NULL, timestamp int(11) unsigned NOT NULL, actkey varchar(35) NOT NULL, ip varchar(15) NOT NULL, regdate int(11) unsigned NOT NULL, PRIMARY KEY ( username ) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS usersusername VARCHAR(30)NOT NULL, password VARCHAR(40)默认NULL, usersalt VARCHAR(8)NOT NULL, userid VARCHAR(32)默认NULL, userlevel TINYINT(1)无符号NOT NULL, email VARCHAR (50)默认NULL, timestamp int(11)无符号NOT NULL, actkey varchar(35)NOT NULL, ip varchar(15)NOT NULL, regdate int(11)无符号NOT NULL,PRIMARY KEY( username ))ENGINE = InnoDB DEFAULT CHARSET = latin1;

CREATE TABLE IF NOT EXISTS photos ( ref int(10) unsigned NOT NULL auto_increment, photo varchar(75), Firstname varchar(35), Lastname varchar(35), Age INT(3), author varchar(30) NOT NULL, PRIMARY KEY (ref) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 如果不存在照片则创建表(ref int(10)unsigned NOT NULL auto_increment,photo varchar(75),Firstname varchar(35),Lastname varchar(35),Age INT(3),作者varchar(30)NOT NULL,PRIMARY KEY(ref))ENGINE = InnoDB DEFAULT CHARSET = latin1;

A few changes, but otherwise works for me. 进行一些更改,否则对我有用。 But try to set foreign key on id column, not varchar. 但是尝试在id列而不是varchar上设置外键。

It looks like your table definition needs a comma after photo varchar(75) 看起来您的表格定义在photo varchar(75)之后需要逗号photo varchar(75)

CREATE TABLE IF NOT EXISTS photos (
    ref int(10) unsigned NOT NULL auto_increment,
    photo varchar(75),
    Firstname varchar(35),
    Lastname varchar(35),
    Age INT(3),
    author varchar(30) NOT NULL,
PRIMARY KEY (ref)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM